2016-09-27 47 views
2

我搜索了一下,但沒有找到解決這個具體情況。給定一個管道輸出任意數量的非空行分隔的單個空白行的組合,是否有一個sed單行(或awk單行或perl單行),將非空行組合成單行,同時保留空行?例如,輸入sed結合由空行分隔的N個文本行?

one 
two 

three 
four 
five 

six 

seven 
eight 

應該輸出

one two 

three four five 

six 

seven eight 

在此先感謝所有誰迴應。

回答

3

Perl的單行

perl -00 -lpe 'tr/\n/ /' 

其中

  • -00在空白行分隔段落
  • -l讀取輸入自動處理結束的行自動換行
  • -p在處理後打印每個記錄
  • tr/\n/ /'改變所有換行符爲空格
+0

這與廣告一樣。謝謝! – Leslie

3

樣品輸入修改,以包括一個以上的連續的空行

$ cat ip.txt 
one 
two 


three 
four 
five 

six 

seven 
eight 

awk溶液:

 
$ awk -v RS= -v ORS="\n\n" '{gsub("\n"," "); print}' ip.txt 
one two 

three four five 

six 

seven eight 

爲了保持多個坯件,以及:

$ perl -0777 -pe 's/[^\n]\K\n(?=^[^\n])/ /mgs' ip.txt 
one two 


three four five 

six 

seven eight 
  • -0777將發出聲音整個文件作爲一個字符串,所以不適合,如果輸入文件足夠大,以不適合在存儲器
  • 正則表達式匹配的非換行符隨後換行符和下一行不是空行。回顧後發和前瞻用於便於更換,避免遞歸搜索
4

這可能會爲你工作(GNU SED):

sed '/./{:a;N;s/\n\(.\)/ \1/;ta}' file 

如果該行不爲空,閱讀下面這行,如果不是用空格替換換行符並重復,否則打印模式空間。如果該行的第一個地方是空的打印空行:這迎合了一個空的第一行,如果不是這種情況,那麼有且只有一個非空行之間的空行:

sed ':a;N;s/\n\(.\)/ \1/;ta' file 

是足夠了。

3

awk解決方案:如果您不希望在輸出中出現空行,只需將RS設置爲空行,並將ORS設置爲空行,而將ORS設置爲兩行。

awk -v RS= -v ORS="\n\n" '{$1=$1}1' foo.in 
one two 

three four five 

six 

seven eight 
相關問題