2012-09-11 56 views
1

我試圖通過刪除重複的空行來壓縮文本文檔,使用sed。這是我在做什麼(沒有用):如何用SED刪除多個空行?

sed -i -E 's/\n{3,}/\n/g' file.txt 

據我所知,這是不正確的,根據this manual,但我無法弄清楚如何正確地做到這一點。謝謝。

+1

這是行不通的,因爲'sed'一次只能讀一行。將線條收集到內存中,然後抑制重複的空行是可能的,但有點複雜。但這在'awk'或Perl中是微不足道的。是否真的需要使用'sed'? 'perl -0777pi -e's/\ n {3,}/\ n/g'file.txt' – tripleee

+0

'sed'不是強制性的,我可以使用'perl'。請發佈您的建議作爲答案 – yegor256

+0

檢查在這裏:http://theunixshell.blogspot.in/2013/01/deleting-empty-lines-from-file.html – Vijay

回答

3

由於tripleee上述建議,我m使用Perl而不是sed

perl -0777pi -e 's/\n{3,}/\n\n/g' 
2

使用翻譯功能

tr -s '\n' 

-s或--squeeze重複序列減少重複字符的序列的單個實例。

+2

但這會擠壓一個或多個,而不是三個或更多。 – tripleee

+0

這將刪除*全部*空行,而不是將多個空行壓縮到單個空行。 –

3

我想你想用一個空行來替代多個空行跨度,即使你的例子取代的\n多次運行同一個\n而不是\n\n。考慮到這一點,這裏有兩種解決方案:

sed '/^$/{ :l 
    N; s/^\n$//; t l 
    p; d; }' input 

在sed的許多實現方式中,可全部在同一行,由;取代嵌入式換行符。

awk 't || !/^$/; { t = !/^$/ }' 
1

這是通過tr -s '\n'cat -s更好的處理,但如果你堅持sed,這裏是從GNU sed的手冊的第4.17節的例子:

#!/usr/bin/sed -f 

# on empty lines, join with next 
# Note there is a star in the regexp 
:x 
/^\n*$/ { 
    N 
    bx 
} 
# now, squeeze all '\n', this can be also done by: 
# s/^\(\n\)*/\1/ 
s/\n*/\ 
/
+0

不知道'cat'的'-s'選項。謝謝! – radical7