Bash

如何在文件末尾添加換行符?

  • December 14, 2021

使用版本控制系統時,當差異顯示時,我對噪音感到惱火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\在新行上附加以下文本(在這種情況下什麼都不是)

換句話說,如果最後一行包含一個不是換行符的字元,則追加一個換行符。

引用自:https://unix.stackexchange.com/questions/31947