sedを使用して内容に応じてファイル名をまとめて変更しますか?

sedを使用して内容に応じてファイル名をまとめて変更しますか?

このパターンをすべて含むファイルがたくさんありますSIZE1=%d。その小数点を見つけて各ファイル名にプレフィックスを追加する方法はありますか%d_

また、すべてのファイルが含まれている場合は、SIZE1=%dすべてのSIZE2=%eファイル名にプレフィックスを追加できますか%d_%e_

sed私はこれに経験がないので、私がどれだけできるかを調べようとしています。

編集:たとえば、test_result.logファイルのどこかに別の行があり、ファイル名SIZE1=100を 。SIZE2=150100_150_test_result.log

ベストアンサー1

GNU sedを使用すると、2段階のsed呼び出しでこれを行うことができます。まず、いくつかのテストデータを生成します。

for i in {1..10}; do 
  if (( RANDOM%2 )); then 
    echo SIZE1=$((RANDOM%10)) > test$i.log
  else 
    echo SIZE1=$((RANDOM%10)) SIZE2=$((RANDOM%10)) > test$i.log
  fi
done

生成されたデータを確認してください。

head test*

出力:

==> test10.log <==
SIZE1=7

==> test1.log <==
SIZE1=5

==> test2.log <==
SIZE1=4 SIZE2=1

==> test3.log <==
SIZE1=9

==> test4.log <==
SIZE1=9 SIZE2=8

==> test5.log <==
SIZE1=6

==> test6.log <==
SIZE1=6

==> test7.log <==
SIZE1=5

==> test8.log <==
SIZE1=4 SIZE2=3

==> test9.log <==
SIZE1=3 SIZE2=8

SIZE1sum first を含むすべてのファイルを検索するには、SIZE2段落モード、つまりb一致が成功した後に、次のファイルに分岐()を使用します。

パラメーターの抽出.sed

/.*SIZE1=([0-9]+).*SIZE2=([0-9]+).*/ { F; s//\n\1_\2_\n/; p; b; }
/.*SIZE2=([0-9]+).*SIZE1=([0-9]+).*/ { F; s//\n\2_\1_\n/; p; b; }
/.*SIZE1=([0-9]+).*/                 { F; s//\n\1_\n/;    p; b; }

パラメータとファイル名がある場合は、必要なコマンドを作成します。

cmds.sedの生成

N
s/([^\n]*)\n(.*)$/mv \1 \2\1/

次のように実行します。

sed -znsEf extract-params.sed test* | sed -Ef create-cmds.sed

出力:

mv test1.log 5_test1.log
mv test2.log 4_1_test2.log
mv test3.log 9_test3.log
mv test4.log 9_8_test4.log
mv test5.log 6_test5.log
mv test6.log 6_test6.log
mv test7.log 5_test7.log
mv test8.log 4_3_test8.log
mv test9.log 3_8_test9.log
mv test10.log 7_test10.log

これをシェルにパイプで接続するか、GNU sedの/eモード修飾子を使用できます。

おすすめ記事