Bash
如何在文件末尾添加換行符?
使用版本控制系統時,當差異顯示時,我對噪音感到惱火
No newline at end of file
。所以我想知道:如何在文件末尾添加換行符以消除這些消息?
為了遞歸地清理一個項目,我使用這個 oneliner:
git ls-files -z | while IFS= read -rd '' f; do tail -c1 < "$f" | read -r _ || echo >> "$f"; done
解釋:
git ls-files -z
列出儲存庫中的文件。它採用可選模式作為附加參數,如果您想將操作限制為某些文件/目錄,這在某些情況下可能很有用。作為替代方案,您可以使用find -print0 ...
或類似的程序列出受影響的文件 - 只需確保它發出 -NUL
分隔的條目。while IFS= read -rd '' f; do ... done
遍歷條目,安全地處理包含空格和/或換行符的文件名。tail -c1 < "$f"
從文件中讀取最後一個字元。read -r _
如果缺少尾隨換行符,則以非零退出狀態退出。|| echo >> "$f"
如果前一個命令的退出狀態為非零,則在文件中附加一個換行符。
給你:
sed -i -e '$a\' file
或者對於 OS X
sed
:sed -i '' -e '$a\' file
僅
\n
當文件尚未以換行符結尾時,才會在文件末尾添加。所以如果你執行它兩次,它不會添加另一個換行符:$ cd "$(mktemp -d)" $ printf foo > test.txt $ sed -e '$a\' test.txt > test-with-eol.txt $ diff test* 1c1 < foo \ No newline at end of file --- > foo $ echo $? 1 $ sed -e '$a\' test-with-eol.txt > test-still-with-one-eol.txt $ diff test-with-eol.txt test-still-with-one-eol.txt $ echo $? 0
這個怎麼運作:
$
表示文件結束a\
在新行上附加以下文本(在這種情況下什麼都不是)換句話說,如果最後一行包含一個不是換行符的字元,則追加一個換行符。