banner
niracler

niracler

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

なぜファイルは改行文字で終わる必要があり、それを確保する方法は何ですか

ただの少しの知識を記録する記事ですが、このトピックは非常に小さいです。しかし、私はそれが面白いと思っており、それを理解し、説明することができます。

行の定義について#

以下のようなリマインダーから始まるものですが、おそらく皆さんは見たことがあるでしょう。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            

私はふと疑問に思いました。なぜ 1 行減らすのではなく、元の最後の行を変更するのでしょうか。なぜ print("hello world")\nprint("hello world") を区別する必要があるのでしょうか。

これは実際には、行の定義に関連しています(3.206 Line)。

改行文字を含まない 0 個以上の非改行文字のシーケンスと、終端の改行文字。

行は、0 個以上の非改行文字のシーケンスと、終端の改行文字で構成されます。ここでの「終端の改行文字」という言葉に注目してください。これは、posix の定義では行の終わりに改行文字が必要であることを意味します。したがって、正確に言えば、改行文字は行の終わりを表す一部であり、改行文字がない行は行とは見なされません

したがって、私は上記の操作で元の完全な行から \n を削除しました。

問題が発生する可能性#

したがって、posix の標準に従うコマンドやソフトウェアでは、行の終わりが \n であることを確認しています。ファイルの終わりが改行文字でない場合、一部の状況で問題が発生する可能性があります。

ここでは、 wc -l の例を挙げます:

image

私の解決策#

  1. vim や nano などのツールは、ファイルを保存する際に自動的に末尾に空行を追加します。
  2. VSCode の拡張機能:ファイルを保存する際に、自動的に末尾に改行記号を追加します。
    image
  3. リンターの拡張機能:pylint などのリンターの拡張機能をインストールすると、行末に改行記号がない場合に自動的に改行記号が追加されます。
  4. シェルスクリプト:ディレクトリ内のすべてのファイルに対して、行末に改行記号がない場合は自動的に改行記号を追加します。
     nini_ensure_newline(){
         find . -type f | while read -r file; do
             if [ "$(tail -c 1 "$file")" != '' ]; then
                 echo "Processing $file"
                 echo "" >> "$file"
             fi
         done
     }
    

参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。