如何使用sed替换文本文件中第N次出现的指定字符串?
使用sed精准替换第n次出现的指定字符串
我刚好碰到过类似的需求,其实sed本身就有简洁的语法能搞定每行内第n次出现的字符串替换,完全匹配你给出的例子场景。
针对你的文本示例,直接运行这条命令就能得到想要的结果:
# 替换每行中第3次出现的'is'为'hat' echo "is this just real life or is this just fantasy or is it just me" | sed 's/is/hat/3'
输出结果会是:
is this just real life or is this just fantasy or hat it just me
语法解释
sed 的替换命令 s/pattern/replacement/flags 里,数字类型的 flag 就是用来指定当前行内第几次匹配的内容进行替换。把上面命令里的3改成你需要的次数,is改成目标匹配字符串,hat改成替换后的内容,就能适配你的实际需求。
如果你需要的是整个文件范围内第n次出现的替换(跨多行计数),那就要用稍复杂一点的脚本,利用sed的保持空间(hold space)来累计匹配次数:
# 替换整个文件中第3次出现的'is'为'hat' sed -n '1{x;s/^/0/;x};G;s/\n/ /;s/is/\n&/3;t replace;P;D;:replace;s/\n//;s/is/hat/;s/ /\n/;h;s/.*\n//;x;p;x;D' your_file.txt
这个脚本的核心逻辑是:用保持空间存储匹配计数,每处理一行就检查累计匹配次数,直到达到目标次数时执行替换,之后恢复正常处理流程。
内容的提问来源于stack exchange,提问作者user7091463
相关产品推荐
相关产品推荐

