我想替换所有排除第一个结果
我有txt文件:
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC
我想得到这个:
AAA
BBB <-- stay same
CCC
AAA
XXX <-- 2nd find replaced
CCC
AAA
XXX <-- 3rd and nth find replaced
CCC
我看起来与此类似,但是对于整行,而不是行中的单词
sed -i 's/AAA/XXX/2' ./test01
答案 0 :(得分:4)
使用分支:
sed -e'/BBB/ {ba};b; :a {n;s/BBB/XXX/;ba}'
即。在第一个BBB上,我们分支到:a
,否则b
没有参数开始处理下一行。
在:a
下,我们在新行中读取,将所有BBB
替换为XXX
并再次转移到a
。
答案 1 :(得分:0)
关注docnum : DOC0017133
custname : Mary
address1 : 45, First Avenue
address2 : 10001 New York
netamount : 66.18
grossamount : 86.034
也可以帮助您。
awk
答案 2 :(得分:0)
$ # replace all occurrences greater than s
$ # use gsub instead of sub to replace all occurrences in line
$ # whole line: awk -v s=1 '$0=="AAA" && ++c>s{$0="XXX"} 1' ip.txt
$ awk -v s=1 '/AAA/ && ++c>s{sub(/AAA/, "XXX")} 1' ip.txt
AAA
BBB
CCC
XXX
BBB
CCC
XXX
BBB
CCC
$ # replace exactly when occurrence == s
$ awk -v s=2 '/AAA/ && ++c==s{sub(/AAA/, "XXX")} 1' ip.txt
AAA
BBB
CCC
XXX
BBB
CCC
AAA
BBB
CCC
进一步阅读:Printing with sed or awk a line following a matching pattern
答案 3 :(得分:0)
awk '/BBB/{c++;if(c >=2)sub(/BBB/,"XXX")}1' file
AAA
BBB
CCC
AAA
XXX
CCC
AAA
XXX
CCC
答案 4 :(得分:0)
只要您的文件不包含null
字符(\0
),您就可以通过使用空字符{{1}插入sed来分隔记录来欺骗sed将整个文件视为一个大字符串而不是带有sed选项\0
的默认\n
:
-z
最后的 $ sed -z 's/BBB/XXX/2g' file66
AAA
BBB
CCC
AAA
XXX
CCC
AAA
XXX
CCC
表示从第二场比赛开始,然后是全局比赛。
您可以毫无问题地将/2g
与-i
合并。