sed 的 s///n 语法中,n 为 1~512 的整数,表示仅当模式在当前行第 n 次出现时才替换;如 sed 's/abc/xyz/2' 仅替换每行第二个 abc,不加 g 可避免误替换,/2 与 g 冲突应避免。

只替换每行中第二次出现的关键词,关键在于用数字标记控制替换位置,而不是用 g 全局替换。
用数字 n 指定第几次匹配才替换
sed 的 s///n 语法中,n 是一个 1~512 的整数,表示“仅当该模式在当前行第 n 次出现时才执行替换”。
-
sed 's/abc/xyz/2' file.txt:每行中第二个abc替换为xyz,其余不变 - 如果某行只有一个
abc,这行就不会发生替换 - 如果某行有三个
abc,只有第二个被改,第一个和第三个保留原样
避免误杀:不加 g 就天然安全
默认行为就是“只处理第一次匹配”,加上 /2 后,它不会影响其他位置——既不替换第一次,也不碰第三次以后。这种精准定位正是防误杀的核心机制。
- 错误写法:
sed 's/abc/xyz/2g'—— /2 和 g 冲突,实际以 g 为主,会全局替换,失去“仅第二次”的语义 - 正确写法:
sed 's/abc/xyz/2'或sed -i 's/abc/xyz/2' file.txt(加 -i 直接改文件)
结合地址范围进一步限定行
若还需限制只在某些行生效(比如只处理第 5 到第 10 行),可叠加行地址:
-
sed '5,10s/abc/xyz/2' file.txt:仅在第 5–10 行内,替换每行第二个abc -
sed '/^INFO/s/error/warn/2' log.txt:只对以INFO开头的行,替换其中第二个error
测试建议:先预览再写入
别急着加 -i,先确认效果:
-
sed 's/target/replacement/2' input.txt→ 看屏幕输出是否符合预期 - 想只看被修改的行?加 -n 和 p:
sed -n 's/target/replacement/2p' input.txt











