使用sed命令将txt文本中的所有序号加上10000

文章讲述了作者在处理txt文件时,想将文件名中的数字加10000,开始误用`sed`的全局标志`g`,导致输出错误。后来理解到不加g参数,仅`s`命令已对所有行生效,最终解决了问题。
摘要由CSDN通过智能技术生成

本人最近处理数据,需要将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前如果不加任何数字,已经表示对所有行生效了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值