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

如何删除文件中最后一个Pattern 1与Pattern 2间内容?优先sed方案

解决方案:删除最后一个Pattern 1与Pattern 2之间的内容(含模式本身)

我来给你几个可行的方案,优先提供你要求的sed实现,其他工具的方案也附上供参考:

Sed 方案(优先推荐)

方案1:通用扩展正则写法(兼容大部分sed版本)

这个写法利用正则的贪婪匹配特性,捕获到最后一个Pattern 1之前的所有内容,然后替换掉后面的部分:

sed -E 's/(.*Pattern 1).*Pattern 2/\1/' file1

解释:

  • -E:启用扩展正则表达式,避免对括号等符号转义;
  • (.*Pattern 1):贪婪匹配所有内容直到最后一个Pattern 1,并将这部分捕获为分组1;
  • .*Pattern 2:匹配从最后一个Pattern 1到Pattern 2的所有内容;
  • \1:替换为捕获的分组1内容,也就是保留最后一个Pattern 1之前的所有内容。

测试你的示例内容后,输出正好是你想要的结果:

Pattern 1 some text to keep nice text here Pattern 1 another text to keep

方案2:GNU Sed 专属写法(整文件处理)

如果你的环境是GNU Sed,可以用-z参数把整个文件作为单行处理,直接删除末尾的目标段:

sed -z 's/Pattern 1.*Pattern 2$//' file1

解释:

  • -z:用空字符作为行分隔符,将整个文件读入内存作为单行;
  • Pattern 1.*Pattern 2$:匹配从最后一个Pattern 1到文件末尾的Pattern 2的所有内容;
  • 替换为空字符串,直接删除目标段。

其他工具方案

Awk 实现

把整个文件内容读入缓冲区,最后做替换处理:

awk '{buf = buf $0} END {sub(/Pattern 1.*Pattern 2$/, "", buf); print buf}' file1

解释:

  • 逐行读取文件并拼接进buf变量;
  • END阶段:用sub函数删除最后一个Pattern 1到Pattern 2的内容;
  • 打印处理后的buf。

Perl 实现

和第一个sed方案逻辑类似,利用整文件读取和贪婪匹配:

perl -0777 -pe 's/(.*Pattern 1).*Pattern 2/\1/' file1

解释:

  • -0777:将整个文件作为单个字符串读入;
  • -pe:遍历(这里是单次遍历整文件)并执行替换后打印;
  • 正则逻辑和sed方案1完全一致。

内容的提问来源于stack exchange,提问作者Mikhail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:05