You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:27:36