2013-02-23 109 views
2

我希望使用sed或awk刪除文件中的空行(新行,製表符和空格),但前提是這些空行位於兩個模式之間。刪除圖案之間的空行

lorem lorem PATTERN1 

\t 

PATTERN2 lorem2 lorem2` 

我期待下面的結果是兩行與兩個模式的連接。

lorem lorem PATTERN1PATTERN2 lorem2 lorem2 
+0

sed「/ PATTERN1 /,/ PATTERN2/d」文件 – user537723 2013-02-23 17:40:22

回答

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替換第一個和第二個pat之間的所有空格,製表符和換行符燕鷗。
+0

你能解釋這個魔法嗎? – user537723 2013-02-23 21:05:55

+0

@ user537723看到編輯 – potong 2013-02-24 11:34:24

0

如果你只是想刪除包含包含式樣1和式樣2線之間只有空白行,只是做:

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

在你給的樣本輸出,看來你也想消除隨後式樣1換行,你想怎麼像對待輸入,但目前還不清楚:

PATTERN1 
non-empty-line 

PATTERN2 

你也不希望如何處理

PATTERN1 non-whitesapce 
PATTERN2 

也許需要澄清一下這個問題。如果你真的只是想消除pattern1pattern2之間的所有空格,它可能是最容易:

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

@ user537723:你可以嘗試AWK:

---改善以前的帖子,所以它打印在一模式之間的線---

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

改變了我的帖子,所以它現在在一行上... – Scrutinizer 2013-02-26 17:35:32

1

的GNU AWK相當於@ WilliamPursell的Perl腳本的:

awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file