我試圖通過刪除重複的空行來壓縮文本文檔,使用sed
。這是我在做什麼(沒有用):如何用SED刪除多個空行?
sed -i -E 's/\n{3,}/\n/g' file.txt
據我所知,這是不正確的,根據this manual,但我無法弄清楚如何正確地做到這一點。謝謝。
我試圖通過刪除重複的空行來壓縮文本文檔,使用sed
。這是我在做什麼(沒有用):如何用SED刪除多個空行?
sed -i -E 's/\n{3,}/\n/g' file.txt
據我所知,這是不正確的,根據this manual,但我無法弄清楚如何正確地做到這一點。謝謝。
由於tripleee上述建議,我m使用Perl而不是sed
:
perl -0777pi -e 's/\n{3,}/\n\n/g'
使用翻譯功能
tr -s '\n'
-s或--squeeze重複序列減少重複字符的序列的單個實例。
但這會擠壓一個或多個,而不是三個或更多。 – tripleee
這將刪除*全部*空行,而不是將多個空行壓縮到單個空行。 –
我想你想用一個空行來替代多個空行跨度,即使你的例子取代的\n
多次運行同一個\n
而不是\n\n
。考慮到這一點,這裏有兩種解決方案:
sed '/^$/{ :l
N; s/^\n$//; t l
p; d; }' input
在sed的許多實現方式中,可全部在同一行,由;
取代嵌入式換行符。
awk 't || !/^$/; { t = !/^$/ }'
這是通過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*/\
/
不知道'cat'的'-s'選項。謝謝! – radical7
這是行不通的,因爲'sed'一次只能讀一行。將線條收集到內存中,然後抑制重複的空行是可能的,但有點複雜。但這在'awk'或Perl中是微不足道的。是否真的需要使用'sed'? 'perl -0777pi -e's/\ n {3,}/\ n/g'file.txt' – tripleee
'sed'不是強制性的,我可以使用'perl'。請發佈您的建議作爲答案 – yegor256
檢查在這裏:http://theunixshell.blogspot.in/2013/01/deleting-empty-lines-from-file.html – Vijay