2014-07-16 164 views
3

我寫了一個sed腳本,它用一個空白行代替多個空行,但它不能按預期工作。我會感謝大家,誰能解釋我爲什麼。請不要參考工作示例,我對Google很熟悉。我只想了解sed是如何工作的。sed用單個空白行替換多個空白行

該代碼是

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file 

所以邏輯很簡單:sed的時讀取的行,它是空的,或者具有幾個換行碼元(在此是/^*\n$條件),我告訴SED到下一行追加模式空間。只要發現非空行,替換s/^\n\n*/\n/就完成了。

一切工作正常,除了在文件末尾有空白行的情況。這些空白不會被替換爲一個空白,我不明白爲什麼。

任何想法?

回答

4

問題是sed在讀取下一行時得到EOF

使用N讀取下一行時,您的命令正在完成。因爲,在閱讀下一行時,sed變得EOF。所以,它不會處理s/^\n\n*/\n/替代。這就是爲什麼你無法刪除出現在文件結尾的空行序列。

我的解決辦法是:

sed ':a; /^\n*$/{ s/\n//; N; ba};' yourfile 
1

相反的\n\n*,你可以使用\n+

順便說一句,這是它會是什麼樣子作爲一個Perl的一行:

perl -0777 -pe 's/\n+/\n/g' yourfile 

或者,相同的結果,但少換人:

perl -0777 -pe 's/\n\n+/\n/g' yourfile 

或者,更神奇,嘗試通過@hwnd提出這個緊湊的解決方案:

perl -00 -pe '' 
+0

運希望與一個空行全部更換爲連續blanklines。您的命令刪除所有空白行。 –

+0

這不能解決問題,如果使用'\ n +',文件末尾的換行符仍然會被忽略。另外,OP指定他想與sed – Aserre

+0

@ zx81一起工作如果你想刪除連續的空行,使用'perl -00 -pe''' – hwnd