banner
niracler

niracler

长门大明神会梦到外星羊么?
github
email
steam_profiles
douban
nintendo switch
tg_channel
twitter_id

翻譯為繁體中文: 為什麼文件要以換行符結尾,以及我們應當如何保證

這只是一篇稍微記錄一點知識的文章,這個知識點很小。但其實我覺得挺有趣的,而我又能夠 handle 住並能講清楚的。

關於行的定義#

事情源於下面這樣一個提醒,源於 git diff,相信大家都是看過的。\No newline at end of file

diff --git a/demo.py b/demo.py
index 8cde782..e75154b 100644
--- a/demo.py
+++ b/demo.py
@@ -1 +1 @@
-print("hello world")
+print("hello world")
\ No newline at end of file            

容我思考一個問題,為什麼不是減了一行而是對原有的最後一行進行了修改。為什麼要區分 print("hello world")\nprint("hello world")

這其實涉及到了 posix 中對行的定義。(3.206 Line

A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

行是由一系列零個或多個非 <newline> 字符,以及 一個終止的 <newline> 字符組成的。注意此處的「以及」兩個字,這意味著在 posix 的定義中行是必須有一個 <newline> 作為結尾, 所以準確來說,換行符是終止的行的一部分,沒有換行符的行不算是一行

所以上面這個操作我是將原來的完整的一行裡面的 \n 給刪除了

可能會導致的問題#

所以嘛,只要遵守 posix 標準的命令或者軟體,都會確保一行的結束是為 \n 才算是真正的一行。要是文件結尾不為換行符,可能在一些情況下會存在問題。

我此處就只舉一個例子 wc -l

image

我的解決方案#

  1. 像 vim 以及 nono 這種工具,是會在保存文件的時候自動幫你在末尾補空行的。
  2. vscode 插件:在你保存文件的時候,自動保證最後的換行符號。
    image
  3. linter 插件:可以裝一些 linter 插件什麼的, 例如 pylint, 在你沒有換行符號結尾的時候自動加換行符。
  4. shell 腳本:自動給目錄下的所有文件,沒有換行符結尾的話,都加一個換行符。
     nini_ensure_newline(){
         find . -type f | while read -r file; do
             if [ "$(tail -c 1 "$file")" != '' ]; then
                 echo "Processing $file"
                 echo "" >> "$file"
             fi
         done
     }
    

參考資料#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。