このパターンをすべて含むファイルがたくさんありますSIZE1=%d
。その小数点を見つけて各ファイル名にプレフィックスを追加する方法はありますか%d_
?
また、すべてのファイルが含まれている場合は、SIZE1=%d
すべてのSIZE2=%e
ファイル名にプレフィックスを追加できますか%d_%e_
?
sed
私はこれに経験がないので、私がどれだけできるかを調べようとしています。
編集:たとえば、test_result.log
ファイルのどこかに別の行があり、ファイル名SIZE1=100
を 。SIZE2=150
100_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
SIZE1
sum 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
モード修飾子を使用できます。