替换第N行的搜索结果

时间:2018-04-09 13:37:32

标签: sed text-processing

我想替换所有排除第一个结果

我有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

5 个答案:

答案 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合并。