我想替换除第一个结果之外的所有结果
我有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发布于 2018-04-09 21:52:46
使用分支:
sed -e'/BBB/ {ba};b; :a {n;s/BBB/XXX/;ba}' 也就是说,在第一个BBB上,我们转移到:a,否则不带参数的b开始处理下一行。
在:a下,我们读入一个新行,将所有BBB替换为XXX,并再次分支到a。
发布于 2018-04-09 21:55:49
在同样的问题上,遵循awk也可能对你有所帮助。
awk '{++a[$0];$0=$0=="AAA"&&(a[$0]==2||a[$0]==3)?$0 ORS "XXX":$0} 1' Input_file发布于 2018-04-09 22:19:07
$ # 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
https://stackoverflow.com/questions/49734360
复制相似问题