如何使用sed正则匹配多行范围并整体替换为指定内容
sed多行范围整体替换实现方案
问题核心
需要将正则匹配到的连续多行区间(从含second的行到含fourth的行)整体替换为单次出现的found,不能直接把s///替换语法和范围匹配语法硬拼,需要遵循sed的「地址范围+操作命令」语法规则。
直接可用的最简命令
使用sed原生的块替换命令c(change),可以一行实现需求,不需要逐行替换:
# GNU sed(绝大多数Linux发行版默认自带的sed版本) sed '/second/,/fourth/c found' 你的文本文件路径
# BSD/macOS 系统自带sed sed '/second/,/fourth/c\found' 你的文本文件路径
执行以上命令后,输出结果完全符合预期:
first found fifth sixth seventh eighth
语法说明
之前设想的sed 's/second/,/fourth/found/'不符合sed语法规则:
s///是单行替换命令,格式固定为s/匹配正则/替换内容/可选标志,中间不能插入范围定位的逗号和结束匹配正则/起始正则/,/结束正则/是地址范围定位符,必须写在操作命令前面,用来指定后续操作要生效的行区间c命令专门用于替换整行/整段行块:当c绑定多行地址范围时,整个连续匹配的行块会被整体替换一次为c后面的文本,不会逐行重复替换。
基于s命令的等价写法
如果一定要组合s///替换命令和范围匹配,可以通过「删除区间内多余行+替换区间首行」的逻辑实现:
sed '/second/,/fourth/{/second/!d;s/.*/found/}' 你的文本文件路径
逻辑拆解:
/second/,/fourth/:锁定从含second的行到含fourth的行的连续区间/second/!d:删除区间内所有不匹配second的行(也就是原third、fourth两行)s/.*/found/:将区间内剩下的首行(原second所在行)整行替换为found
内容的提问来源于stack exchange,提问作者Harry Muscle
相关产品推荐
相关产品推荐

