我希望使用sed或awk删除文件中的空白行(新行,制表符和空格),但前提是这些空白行位于两种模式之间。
lorem lorem PATTERN1
\t
PATTERN2 lorem2 lorem2`
我希望下面的结果是两行两种模式的串联。
lorem lorem PATTERN1PATTERN2 lorem2 lorem2
答案 0 :(得分:5)
这可能适合你(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
替换第一个和第二个模式之间的所有空格,制表符和换行符。答案 1 :(得分:1)
GNU awk相当于@WilliamPursell的perl脚本:
awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
答案 2 :(得分:0)
如果您只想删除包含PATTERN1和PATTERN2的行之间仅包含空格的行,请执行以下操作:
sed '/PATTERN1/,/PATTERN2/{ /^[ \t]*$/d}'
在您提供的示例输出中,您似乎还想要消除PATTERN1之后的换行符,但不清楚您希望如何处理输入,如:
PATTERN1
non-empty-line
PATTERN2
也不想处理
PATTERN1 non-whitesapce
PATTERN2
或许需要澄清这个问题。如果您真的只想消除pattern1
和pattern2
之间的所有空格,那么它可能最简单:
perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'
答案 3 :(得分:0)
@ user537723:你可以试试awk:
---改进了以前的帖子,所以它在模式之间的一行打印---
awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file