如何用sed/awk匹配正则第二次出现并替换整行(不指定固定行号)
实现方案
需求说明
- 不指定行号,匹配所有包含
remote_addrs的行 - 可控制替换指定次数的匹配行(示例中为替换第2次匹配的行,第1次匹配保留)
- 替换整行内容为
remote_addrs = 3.3.3.3
问题原因
你之前使用的sed命令将整个文件读为单个字符串处理,正则中的.*为贪婪匹配,会直接匹配到文件末尾而非当前行结尾,因此无法实现单一行替换。
sed 实现方案
替换第2次匹配到的remote_addrs行(符合你的示例需求)
# 仅输出修改后的内容,不修改原文件 sed '/remote_addrs/{x;s/^/x/;/^xx$/{x;s/.*/remote_addrs = 3.3.3.3/;x};x}' your_file # GNU sed 直接修改原文件 sed -i '/remote_addrs/{x;s/^/x/;/^xx$/{x;s/.*/remote_addrs = 3.3.3.3/;x};x}' your_file # MacOS 系统 sed 直接修改原文件 sed -i '' '/remote_addrs/{x;s/^/x/;/^xx$/{x;s/.*/remote_addrs = 3.3.3.3/;x};x}' your_file
替换所有匹配到的remote_addrs行
如果需要把所有包含remote_addrs的行全部替换,直接用以下命令即可:
sed 's/^remote_addrs.*/remote_addrs = 3.3.3.3/' your_file
awk 实现方案
替换第2次匹配到的remote_addrs行
# 仅输出修改后的内容 awk '/remote_addrs/{count++} count==2{$0="remote_addrs = 3.3.3.3"}1' your_file # 直接修改原文件(GNU awk 4.1.0+版本支持) gawk -i inplace '/remote_addrs/{count++} count==2{$0="remote_addrs = 3.3.3.3"}1' your_file
替换所有匹配到的remote_addrs行
awk '/remote_addrs/{$0="remote_addrs = 3.3.3.3"}1' your_file
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

