如何用Sed贪婪删除以pattern1起始、后续匹配pattern2的多行内容?
Sed实现匹配指定模式后删除目标行块(含EOF场景)
问题说明
你需要实现:当某行匹配pattern1时,删除该行,同时删除后续所有匹配pattern2的行,直到碰到不匹配pattern2的行(保留该行)或文件末尾。之前的sed /two/,/three/d仅能删除从第一个pattern1行到第一个pattern2行的块,无法满足“删除所有后续匹配pattern2行”的需求,也处理不好EOF场景。另外你提到pattern1和pattern2可能重叠,需要考虑这种情况。
解决方案
根据你的示例输出,实际需求应该是:匹配pattern1后,删除该行,同时删除后续所有匹配pattern1或pattern2的行,直到遇到既不匹配pattern1也不匹配pattern2的行(保留该行)或EOF。对应的Sed命令如下:
sed '/pattern1/{:loop; d; n; /pattern1\|pattern2/b loop}' 文件名
针对你的示例调整
将pattern1设为two,pattern2设为three,命令为:
sed '/two/{:loop; d; n; /two\|three/b loop}' input.txt
命令解释
/two/{...}:当行匹配two时,执行大括号内的逻辑:loop:定义名为loop的标记,用于循环跳转d:删除当前匹配的行n:读取下一行到模式空间/two\|three/b loop:如果当前行匹配two或three,跳回loop标记继续删除;如果不匹配,则保留该行,退出删除逻辑,继续处理后续行
严格按问题描述的方案(仅删除pattern2行)
如果严格按照你描述的“仅删除后续匹配pattern2的行”,即使中间出现pattern1行也保留,命令如下:
sed '/two/{:loop; d; n; /three/b loop}' input.txt
执行后输出会保留中间的two行,结果为:
one six two four five
示例验证
用你的输入内容执行符合示例需求的命令后,输出与你期望的一致:
one six four five
内容的提问来源于stack exchange,提问作者DougCube
相关产品推荐
相关产品推荐

