MSG
私のパスから除外して、括弧を使用してシェルパラメータ拡張を使用したいと思いますPDF
。DOC
MSG
括弧の間に入れるとM
削除されず、削除のみとなりますMSG
。インターネットを見てドキュメントを読んでいますが、まだこれを正しく行う方法を理解できません。たぶん私が検索するのに適したキーワードを知らないかもしれません。
私のコードはMSGのみを削除します。
find "${INPUTPATH}" -mindepth 2 -maxdepth 2 -type d -print0 | while IFS= read -r -d '' file; do
echo "${file}"
casenumber="${file#${INPUTPATH}/[MSG]}"
echo "${casenumber}"
done
入力する:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
/home/user/output/test/MSG/2226-4
/home/user/output/test/MSG/2222 -2
/home/user/output/test/MSG/2222 -2
/home/user/output/test/MSG/2218-0
/home/user/output/test/MSG/2218-0
現在のMSGを削除する出力:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
SG/2226-4
/home/user/output/test/MSG/2222 -2
SG/2222 -2
/home/user/output/test/MSG/2218-0
SG/2218-0
予想出力:
/home/user/output/test/PDF/2218-0
/home/user/output/test/PDF/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/DOC/2218-0
/home/user/output/test/MSG/2226-4
/2226-4
/home/user/output/test/MSG/2222 -2
/2222 -2
/home/user/output/test/MSG/2218-0
/2218-0
実際にMSG、PDF、DOCをこのように削除したいと思います。
find "${INPUTPATH}" -mindepth 2 -maxdepth 2 -type d -print0 | while IFS= read -r -d '' file; do
echo "${file}"
casenumber="${file#${INPUTPATH}/[MSG][PDF][DOC]/}"
echo "${casenumber}"
done
上記のコードが機能しない理由を理解しています。ただし、これを行うには、まずMSGを解決する必要があります。
最終予想出力:
/home/user/output/test/PDF/2218-0
2218-0
/home/user/output/test/DOC/2218-0
2218-0
/home/user/output/test/MSG/2226-4
2226-4
/home/user/output/test/MSG/2222 -2
2222 -2
/home/user/output/test/MSG/2218-0
2218-0
ベストアンサー1
[MSG]
グローバルパターンは1文字M
またはS
に一致しますG
。MSG
、DOC
またはを一致させるには、inまたはin kshをPDF
使用できます。 bash は zsh glob 演算子をサポートしませんが、after を含む ksh 演算子のサブセットをサポートしているため、bash では次のようになります.(MSG|DOC|PDF)
zsh
@(MSG|DOC|PDF)
shopt -s extglob
shopt -s extglob
casenumber=${file#"${INPUTPATH}"/@(MSG|DOC|PDF)}
に割り当てられ、内容に一致する最短の先行部分を削除しcasenumber
(文字通りzshとは異なり、ksh / bashで必要な周辺引用符のおかげで)、またはが続きます。$file
$INPUTPATH
/
MSG
DOC
PDF
shopt -s extglob
kshではbashに固有のもので、kshでは必要ない項目を省略してください。 zshから:
casenumber=${file#$INPUTPATH/(MSG|DOC|PDF)}