2017-08-07 60 views
0

我有一個文件 - 一個,並存在一定的繼續空行(不止一個),見下圖:如何尋找連續空行,並將其轉換爲一個

cat a 
1 

2 


3 



4 

5 

所以首先我想知道如果存在空白行,我試過

cat a | grep '\n\n\n' 

沒有輸出。所以我必須用下面的方式

vi a 
:set list 
/\n\n\n 

所以我想知道是否存在其他shell命令可以很容易地實現這個? 那麼如果存在兩個或多個空行我想將它們轉換爲一個?見下文

1 

2 

3 

4 

5 

起初我試過下面殼

sed 's/\n\n\(\n\)*/\n\n/g' a 

它不工作,那麼我想這個殼

cat a | tr '\n' '$' | sed 's/$$\(\$\)*/$$/g' | tr '$' '\n' 

這一次它的工作原理。而且我想知道如果存在其他方式可以實現這一點?

回答

3

好吧,如果你cat實施支持

-s, --squeeze-blank 
      suppress repeated empty output lines 

那麼它就像

$ cat -s a 
1 

2 

3 

4 

5 


另外,既-s-n進行編號線很可能是可用less命令以及

+0

哇,我不知道'貓'這個選項。 ++ – anubhava

+0

太棒了!很高興知道這個選項。另一個++ :)。 – archemiro

3

awk命令應該工作,以產生輸出與2換行符在每一行:

awk -v RS= '{printf "%s%s", $0, ORS (RT ~ /\n{2,}/ ? ORS : "")}' file 

1 

2 

3 

4 

5 

這AWK是使用:

  • -v RS=:設置空輸入記錄分隔符,使得每個空行成爲記錄分隔符
  • printf "%s%s", $0, ORS:用單行分隔符打印每行
  • (RT ~ /\n{2,}/ ? ORS : ""):打印額外的換行符如果輸入記錄分隔符有2個以上的換行符

您可以在思樂普模式下使用perl還有:

perl -0777 -pe 's/\R{2,}/\n\n/g' file 

1 

2 

3 

4 

5 

司令部解體:

  • -0777 Slurp模式讀取整個文件
  • 's/\R{2,}/\n\n/g' 2場以上的換行符和2號線更換斷
+1

IDK的perl腳本做什麼(誰做:-)),但一個問題與AWK一是它會在輸出結尾添加一個空行,即使輸入結尾沒有任何內容。有了GNU awk,如果這是個問題,你可以通過測試RT來解決這個問題。 –

1

您可以--squeeze-repeatstr然後用sed插入只是一個新行:

<a tr -s '\n' | sed 'G' 
+0

,但它不能保存這些在它們之間沒有空行的行,例如, 6 \ n7 \ n8 – zhuguowei

0

另一個AWK溶液:

awk 'NF' ORS="\n\n" a 
1 

2 

3 

4 

5 

它會檢查是否該行不如果NF(場數)不爲零,則通過測試清空。它匹配,打印行作爲默認操作。 ORS(輸出記錄分隔符)設置爲2個換行符,因此非空行之間有空行。

+1

,但我發現即使在非空行中沒有空行,例如'6 \ n7 \ n8',它們之間也插入了新的一行。 – zhuguowei

0

1)AWK溶液

$ echo "a\n\n\nb\n\n\nc\n\n\n" | awk 'BEGIN{b=0} /^$/{b=1;next} {printf "%s%s\n", b==1?"\n":"",$0} {b=0} END{printf "%s",b==1?"\n":""}' 
     a 

     b 

     c 

$ 

2)的sed溶液

sed ' 

/^$/{ ${ p; d; }; H; d; } 

/^$/!{ x; s/^\(\n\{1,\}\)$/\1/; ts; Tf; } 

:s { x; s/\(.*\)/\n\1/; x; s/.*//; x; p; d; } 

:f { x; p; d; } 

' 

SED說明:

/^$/{ ${ p; d; }; H; d; } 

- - 如果輸入是BLA NK,如果是最後一行,只是打印,否則追加到holdspace和刪除模式空間並開始新的循環

/^$/!{ x; s/^\(\n\{1,\}\)$/\1/; ts; Tf; } 

- - 如果輸入不爲空,在p空間和H空間的交換內容並檢查h空格是否包含\ n。如果是,跳到S,如果不是跳躍到f

:s { x; s/\(.*\)/\n\1/; x; s/.*//; x; p; d; } 

- - 如果空行存在於H空間,然後\ n追加至P的空間,然後清除保留空間,然後打印p空間,並刪除p空間

:f { x; p; d; } 

- - 如果空行是不存在於H空間,然後打印p空間,並刪除p空間

相關問題