本人最近处理数据,需要将txt文件中的
1.jpg hafwlieaf jpg
2.jpg a3ijf3
3.jpg aelinga
4.jpg 123
5.jpg feaw123
6.jpg 123nvaelwi
7.jpg 123 aewlijf
8.png jfolewaijf 123
...
改为
10001.jpg hafwlieaf jpg
10002.jpg a3ijf3
10003.jpg aelinga
10004.jpg 123
10005.jpg feaw123
10006.jpg 123nvaelwi
10007.jpg 123 aewlijf
10008.jpg jfolewaijf 123
一开始,使用了如下命令
sed -E "s/([0-9]+)/echo \$((\1 + 10000))/ge" test.txt
结果如下:
10001.jpg hafwlieaf jpg
10002.jpg aecho 10003ijfecho 10003
10003.jpg aelinga
10004.jpg echo 10123
10005.jpg feawecho 10123
10006.jpg echo 10123nvaelwi
10007.jpg echo 10123 aewlijf
10008.jpg jfolewaijf echo 10123
之后才弄清楚为什么错。g是global的缩写,表全局,即对每一行的所有符合“被替换内容”的文本生效。但由于我们只需要替换开头,其实是不需要g参数的
此外:
这里的-E是使用扩展的正则表达式的意思。
\1指代左边小括号括起来的内容,可以达到引用的目的。
最后e的作用是:将替换部分当成shell指令执行
最后去掉代码中的g,重新执行命令,有:
10001.jpg hafwlieaf jpg
10002.jpg a3ijf3
10003.jpg aelinga
10004.jpg 123
10005.jpg feaw123
10006.jpg 123nvaelwi
10007.jpg 123 aewlijf
10008.jpg jfolewaijf 123
则达到了目的
错误的原因在于,以为为了全局生效,必须使用g参数。其实s前如果不加任何数字,已经表示对所有行生效了。