首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >替换第N行搜索结果

替换第N行搜索结果
EN

Stack Overflow用户
提问于 2018-04-09 21:37:32
回答 5查看 209关注 0票数 1

我想替换除第一个结果之外的所有结果

我有txt文件:

代码语言:javascript
运行
复制
AAA
BBB
CCC
AAA
BBB
CCC
AAA
BBB
CCC

我想要得到这个:

代码语言:javascript
运行
复制
AAA
BBB <-- stay same
CCC
AAA
XXX <-- 2nd find replaced
CCC
AAA
XXX <-- 3rd and nth find replaced
CCC

我看了一些类似的东西,但是是整行的,而不是一行中的单词

代码语言:javascript
运行
复制
sed -i 's/AAA/XXX/2' ./test01
EN

回答 5

Stack Overflow用户

发布于 2018-04-09 21:52:46

使用分支:

代码语言:javascript
运行
复制
sed -e'/BBB/ {ba};b; :a {n;s/BBB/XXX/;ba}' 

也就是说,在第一个BBB上,我们转移到:a,否则不带参数的b开始处理下一行。

:a下,我们读入一个新行,将所有BBB替换为XXX,并再次分支到a

票数 4
EN

Stack Overflow用户

发布于 2018-04-09 21:55:49

在同样的问题上,遵循awk也可能对你有所帮助。

代码语言:javascript
运行
复制
awk '{++a[$0];$0=$0=="AAA"&&(a[$0]==2||a[$0]==3)?$0 ORS "XXX":$0} 1' Input_file
票数 0
EN

Stack Overflow用户

发布于 2018-04-09 22:19:07

代码语言:javascript
运行
复制
$ # 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49734360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档