我有一堆文件,其中都包含该模式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,您应该能够通过两阶段 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
,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
现在可以将其通过管道传输到 shell 中,或者您可以使用 GNU sed 的/e
模式修饰符。