在Unix中删除两指定模式间所有行的问题求助
解决Unix下删除XYZ开头行到ZZZZZ结尾行区间的问题
你的问题出在两个地方:一是用-pe逐行处理文件,没法跨多行匹配区间;二是替换时刻意保留了开头的XYZ,自然删不掉这行。下面给你两种可行的解决办法:
方法一:用Perl一次性处理整个文件
用-0777参数让Perl把整个文件读成一个字符串,这样就能跨多行匹配目标区间,然后直接把整个区间替换为空:
perl -0777 -pe 's/(^|\n)XYZ.*?ZZZZZ(\n|$)//ms' filename
-0777:读取整个文件为单字符串,支持跨多行匹配ms修饰符:m让^/$匹配行首/行尾,s让.匹配换行符- 正则里的
(^|\n)和(\n|$)是为了处理目标区间在文件开头或结尾的情况,避免多删或漏删换行
方法二:用awk逐行控制输出
awk处理行级逻辑更直观,通过一个标记变量控制是否输出行:
awk '/^XYZ/ { skip=1; next } /ZZZZZ$/ { skip=0; next } !skip' filename
逻辑很简单:
- 遇到以
XYZ开头的行,开启跳过模式,不输出该行 - 遇到以
ZZZZZ结尾的行,关闭跳过模式,不输出该行 - 其他非跳过状态的行正常输出
内容的提问来源于stack exchange,提问作者Bbabu
相关产品推荐
相关产品推荐

