2つのパターンの間に文字列を挿入します


2

次のような名前のファイルを変更したい:

d1-a2_A1_B1.txt
abcd_A90_B2.txt

私は挿入する場所_FOO最初の間にある_A[0-9]\+_B[0-9]そのファイル名になり

d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt

しかし、私の正規表現は機能しません:

for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done

私は単一の文字列で試しました:

echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/

OK:これはうまくいきました:

echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'

書式設定が改善されれば、投稿は大幅に改善されます。のフォーマット方法に関するヘルプページを次に示します。自分で編集しますが、他の編集が保留になっているため、編集できません。
トムザイチ

回答:


0
  • -rオプションを追加しますsed(拡張正規表現を使用するために取得します。通常は理解しません+)。
  • あなたの入れsed引用符(好ましくは単一引用符)にスクリプトを。
  • 変更$1および$2スクリプト内へ\1\2

    sed -re ' s /(._ A [0-9] +)(_ B [0-9]。)/ \ 1_FOO \ 2 / '

また、

  • 明確にするために、あなたは変更する場合があります`…`$(…)見る- これをこの、そしてこれは -すなわち、ハンドルecho | sedあなたが扱うのと同じ方法をls
  • それは言って良いでしょうfor f in *(というよりもfor f in $(ls))。
  • シェル変数参照(例えば、echo "$f")を引用するのは、正当な理由がない限り引用する必要があり、何をしているのかを確実に知っている必要があります。

試しましたが、うまくいきませんでした:echo abcd_A90_B2.txt | SED -eの/(._ A [0-9] +)(_ B [0-9])/ $ 1_FOO $ 2 / 'abcd_A90_B2.txtを変更しなかった
user2783615

OK、答えを修正しました。
スコット

0

を使用することで、sedやその他の文字列操作の使用を回避できますmmv

$ mmv -m -n  '*_A*_B*.txt' '#1_A#2_FOO_B#3.txt'
abcd_A90_B2.txt -> abcd_A90_FOO_B2.txt
d1-a2_A1_B1.txt -> d1-a2_A1_FOO_B1.txt

(すべてのファイルが一致し、必要に応じて名前が変更されたことを確認したら、ファイルを-nそのままにするか-v、実際のファイル名に置き換えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.