删除图案之间的空白行

时间:2013-02-23 17:31:39

标签: linux sed awk

我希望使用sed或awk删除文件中的空白行(新行,制表符和空格),但前提是这些空白行位于两种模式之间。

lorem lorem PATTERN1

\t

PATTERN2 lorem2 lorem2`

我希望下面的结果是两行两种模式的串联。

lorem lorem PATTERN1PATTERN2 lorem2 lorem2

4 个答案:

答案 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

或许需要澄清这个问题。如果您真的只想消除pattern1pattern2之间的所有空格,那么它可能最简单:

perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'

答案 3 :(得分:0)

@ user537723:你可以试试awk:

---改进了以前的帖子,所以它在模式之间的一行打印---

awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file