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

答え2

あなたの質問を理解している場合は、何も抽出したくない場合は.one-wayをzz20使用してください。null

FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/\1null\2/')

グループ1には一致前のすべての文字が、zz20グループ2には一致後のすべての文字が格納されます。保存されていない文字のみが失われ、zz20交換されますnull

答え3

テキスト "null" の代わりに null の概念を置き換えるには、次のコマンドを使用できます。

$ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf")
$ echo $FolderNo
2012-09-01 Home insurance quote.pdf

これにより、最初の項目が_zz20何もないものに置き換えられます。これは、sedパラメータの2番目の部分が空であるためです(s/search/replace/=> s/_zz20//)。

私の例は、あなたが引用した例と@Bireiによって提案された例ほど慎重ではありません。ファイルに複数の「_zz20」文字列がある場合、結果は良くありません。

答え4

使用真珠rename:

rename -n 's/.*zz([0-9]+)\.pdf/$1/' ./*

出力がうまくいったら削除してください-n(別名)。dry-run

関連情報