如何删除文件中最后一个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
相关产品推荐
相关产品推荐

