我希望使用 sed 或 awk 删除文件中的空行(新行、制表符和空格),但前提是这些空行位于两个模式之间。
lorem lorem PATTERN1
\t
PATTERN2 lorem2 lorem2`
我期望下面的结果是 2 行与两种模式的串联。
lorem lorem PATTERN1PATTERN2 lorem2 lorem2
这可能对您有用(GNU sed):
sed -r '/PATTERN1/!b;:a;/PATTERN2/bb;$!{N;ba};:b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/\1\2/;tb' file
/PATTERN1/!b
只打印该行,除非它包含第一个模式:a;/PATTERN2/bb;$!{N;ba}
将后续行读入模式空间 (PS),直到遇到第二个模式:b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/;tb
替换第一个和第二个模式之间的所有空格、制表符和换行符。@WilliamPursell 的 perl 脚本的 GNU awk 等效项:
awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
如果您只想删除包含 PATTERN1 和 PATTERN2 的行之间仅包含空格的行,只需执行以下操作:
sed '/PATTERN1/,/PATTERN2/{ /^[ \t]*$/d}'
在您提供的示例输出中,您似乎还想消除 PATTERN1 后面的换行符,但不清楚您希望如何处理输入,例如:
PATTERN1
non-empty-line
PATTERN2
也不是你想怎么处理
PATTERN1 non-whitesapce
PATTERN2
也许需要澄清这个问题。如果您真的只想消除 and 之间的所有空格pattern1
,pattern2
那么最简单的方法可能是:
perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'
@user537723:你可以试试 awk:
---改进了以前的帖子,所以它打印在图案之间的一行上---
awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file