2016-09-16 50 views
2

我有多種使用尾隨新行的方式的文件組合。沒有回車,只有\n。有些文件有多個換行符,有些文件沒有結尾換行符。我想編輯文件。在文件中只需要1個尾隨換行符

如何編輯這些文件以確切地有1個尾隨換行符?

+0

沒有任何UNIX工具可以進行真正的「就地」編輯,它們都會創建一個臨時文件(或者'ed'的內部緩衝區)並用它覆蓋原始文件。那是問題嗎? –

+0

不,臨時文件只要透明即可。我不想處理備份文件。 – Joe

回答

4

要更改文本文件中,地方有一個且只有一個換行符:

sed -zi 's/\n*$/\n/' 

這需要GNU sed的。

-z告訴sed使用NUL字符作爲分隔符讀入文件。由於文本文件沒有NUL字符,因此這會導致一次讀取整個文件。

-i告訴GNU sed更改文件。

s/\n*$/\n/告訴sed用一個換行符替換文件末尾的很多換行符。

+0

但是,如果文件末尾沒有\ n,則不會添加一個 – harmic

+1

@harmic是的,它會。由於'\ n *'匹配_zero_或更多換行符,因此即使沒有任何內容存在,該命令也會添加一行。是什麼讓你說呢? – John1024

3

用一個替換所有尾隨的新行?

$text =~ s/\n+$/\n/; 

這使得與一個換行符的文件在最後–如果它有至少一個開始。如果你想讓它在那裏,即使文件沒有,請用\n*替換\n+

對於就地說明書中,這意味着一個班輪:

perl -i -0777 -wpe 's/\n+$/\n/' file.txt 

開關的含義Command Switches in perlrun進行說明。


這裏是對交換機的總結。請參閱上述文檔以獲得準確的解釋。

  • -i更改文件「到位」。請注意,數據仍被複制並使用臨時文件。

  • -0777讀取整個文件。 -0[oct|hex]設置$/的數字,所以無效與-0

  • -w使用warnigs。不完全一樣use warnings,但有總比沒有好

  • -p''運行的代碼依次對文件的每一行,像-n,然後$_打印

  • -e''之間接下來的執行Perl代碼
    -E是相同的,但也使feature S,像say

注意,我們可以通過使用核心OB::Deparse模塊看到的等效代碼作爲

perl -MO=Deparse -wp -e 1 

這將打印

BEGIN { $^W = 1; } 
LINE: while (defined($_ = <ARGV>)) { 
    '???'; 
} 
continue { 
    print $_; 
} 
-e syntax OK 

表示腳本相當於一個襯墊與-w-p

1
perl -i -0 -pe 's/\n\n*$/\n/' input-file 
1

到目前爲止發佈的解決方案將您的整個輸入文件讀入內存,如果您的文件很大,這將是一個問題。這隻讀取連續的空行到內存中:

awk -i inplace '/./{printf "%s", buf; buf=""; print; next} {buf = buf $0 ORS}' file 

以上使用GNU awk進行就地編輯。