2009-05-28 75 views
27

我有一個包含文件:如何用bash中的單個空行替換多個空行?

something 



something else 

something else again 

我需要一個bash命令,SED/grep的我們,將產生以下輸出

something 

something else 

something else again 

換句話說,我需要更換多個空行只有一條空白線。 grep/sed是基於行的。我從來沒有找到可以在多行正則表達式模式下工作的BASH解決方案。

+0

快速澄清的問題:文件是否有行*不是由空行分隔的行? – biggusjimmus 2009-05-28 18:28:32

+3

你有沒有重複的行不是空白的?如果沒有,你可以使用uniq。 – 2009-05-28 18:38:11

+0

有些行沒有被空行分隔。 可能有重複的行。 – 2009-05-28 20:26:46

回答

65

對於BSD衍生系統(包括GNU):

你只需要cat-s選項,這將導致它來除去重複空

cat -s 

從手冊頁:從它的輸出線-s --squeeze-blank: suppress repeated empty output lines.

1

使用Python:

s = file("filename.txt").read() 
while "\n\n\n" in s: s = s.replace("\n\n\n", "\n\n") 
import sys 
sys.stdout.write(s) 
+0

這是低效率,而循環 – user5672998 2017-12-15 09:49:45

-1

超級容易做到用vim。只需打開該文件並鍵入以下內容:

:%s/\n\n\n*/\r\r/ 

這會將所有塊數超過2的新行減少爲2個新行。希望這可以幫助!

6

其實,如果你有一個換行符替換多個換行符,輸出將是:

something 
something else 
something else again 

你可以做到這一點:

sed /^$/d FILE 
+0

這是正確的,很明顯:)什麼OP可能意味着用一個空行代替多個「空白」(注意,這不一定是空的,因爲線可以有不可見的空白空間)(除非它在序列的開頭或結尾)意味着兩個換行符。 – arielf 2016-06-25 20:59:02

-2

我認爲你可能會想刪除只有空格的行。

這是可以做到的:

sed /^[:space:]*$/d FILE 
2

awk一個解決方案,用一個空行代替幾個空行:

awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile 
+0

+1:偉大的思想家都認爲:P – 2009-05-28 18:43:18

2

通常情況下,如果我發現SED不能做我需要的東西,我轉向awk:

awk ' 
BEGIN { 
    blank = 0; 
} 

/^[[:blank:]]*$/ { 
    if (!blank) { 
      print; 
    } 
    blank = 1; 
    next; 
} 

{ 
    print; 
    blank = 0; 
}' file 
+0

您的解決方案更具可讀性! – mouviciel 2009-05-28 18:45:15

12
grep -A1 . <yourfile> | grep -v "^--$" 

這grep的解決方案的工作假設你要執行以下操作:

輸入

line1 

line2 
line3 


line4 



line5

輸出

line1 

line2 
line3 

line4 

line5
+0

完美。 謝謝! – 2009-05-28 20:22:50

-4

它流水線操作| uniq的可能的解決方案(如果不是空行等不重複)

1

如果有人想用perl

perl -00pe0 < file 

會做同樣的,因爲cat -s :)

2

這對多個文件使用marco's solution

for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done 
9

我只是sed解決了這個問題。即使這是一個7歲的問題,有人可能可以在這裏尋求幫助,所以我通過sed寫我這裏的解決方案:

sed 'N;/^\n$/D;P;D;' 
0

Python中,正則表達式:

import re 
import sys 
sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read())) 
相關問題