2

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

lorem lorem PATTERN1

\t

PATTERN2 lorem2 lorem2`

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

lorem lorem PATTERN1PATTERN2 lorem2 lorem2
4

4 回答 4

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替换第一个和第二个模式之间的所有空格、制表符和换行符。
于 2013-02-23T19:59:54.817 回答
1

@WilliamPursell 的 perl 脚本的 GNU awk 等效项:

awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
于 2013-02-26T13:55:57.620 回答
0

如果您只想删除包含 PATTERN1 和 PATTERN2 的行之间仅包含空格的行,只需执行以下操作:

sed '/PATTERN1/,/PATTERN2/{ /^[ \t]*$/d}'

在您提供的示例输出中,您似乎还想消除 PATTERN1 后面的换行符,但不清楚您希望如何处理输入,例如:

PATTERN1
non-empty-line

PATTERN2

也不是你想怎么处理

PATTERN1 non-whitesapce
PATTERN2

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

perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'
于 2013-02-23T22:13:16.923 回答
0

@user537723:你可以试试 awk:

---改进了以前的帖子,所以它打印在图案之间的一行上---

awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file
于 2013-02-23T22:19:54.713 回答