これは貢献者が作成したsed式です。具体的には、著者は@craig-sandersです。
$FileToMoveは「2012-09-01住宅保険見積_zz20.pdf」に設定されます。
# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')
# On my Mac, I figured that this command needs to be FolderNo=$(echo "$FileToMove" | sed -E -e 's/.*zz([0-9]+)\.pdf/\1/')
上記のコマンドは、ファイル名から「20」を抽出するために使用されます。それでは、zz20をnullに変更したいと思います。
いつもそうしようとしています。 sedを学ぶことになりますが、その前に正規表現を学ぶ必要があります。また、nullに置き換えることも非常に簡単であると確信しています。どのようなヒントがありますか?
ベストアンサー1
ファイル名を変更して移動したいと思います。
私の使用オリジナルスクリプトデフォルトでは、スクリプトの次の部分を変更します。
if [ "$NumFolders" -eq 1 ] ; then
mv "$ParentFolder/$FileToMove" "$TargetFolder/"
else
このような:
if [ "$NumFolders" -eq 1 ] ; then
NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././')
mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName"
else
正規表現を冗長な英語に翻訳すると、ここで sed スクリプトは「入力行で '_zz の後に 1 つ以上の数字の後にリテラルピリオドが続く ' 最初のエントリ」をピリオドに置き換えます。
つまり、Benの答えのように、2つ以上の「_zz20 ...」シーケンスを含むファイルに対して正しい操作を実行しません。これをBireiの正規表現に置き換えるのは簡単です(ただし、\ 1と\ 2の間にある "null"という単語を削除すると、リテラル文字列 "null"に置き換えられます)。
NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$/\1\2/')
しかし、これは一行で完了でき、一時変数($NewFileName)は必要ありませんが、この方法を理解する方が簡単です。