sedを使用してファイル名を変更するには?

sedを使用してファイル名を変更するには?

これは貢献者が作成した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)は必要ありませんが、この方法を理解する方が簡単です。

おすすめ記事