1. ホーム
  2. file

[解決済み] なぜテキストファイルは改行で終わらなければならないのですか?

2022-03-17 23:01:48

質問内容

すべてのテキストファイルは改行で終わるべきであるという格言は、皆さんよくご存じだと思います。私は何年も前からこのルールを知っていましたが、いつも不思議に思っていました。

どうすれば解決するの?

なぜなら、それは を定義しています。 ライン :

3.206 ライン
0個以上の非改行文字と終端文字である改行文字の列。

したがって、改行文字で終わらない行は実際の行とはみなされません。そのため、ファイルの最終行が改行で終わっていないと処理に支障をきたすプログラムがあるのです。

ターミナル・エミュレーターで作業する場合、このガイドラインには少なくとも1つの明確な利点があります。Unix のツールはすべてこの規約を予期しており、それに従って動作します。例えば、ファイルを結合するときに cat 改行で終わるファイルとそうでないファイルでは、効果が異なります。

$ more a.txt
foo
$ more b.txt
bar$ more c.txt
baz
$ cat {a,b,c}.txt
foo
barbaz

また、前の例でも示したように、コマンドラインでファイルを表示する場合(たとえば more ) 改行で終端しているファイルは正しく表示されます。不適切に終了したファイルは、文字化けする可能性があります(2行目)。

一貫性を保つために、このルールに従うことは非常に有用です。そうしないと、デフォルトのUnixツールを扱うときに余分な作業が発生します。


逆に考えるんだ。もし、行が改行で終了していなければ cat のようなファイルを連結するコマンドはどうすればいいのでしょうか?

  1. 各ファイルの先頭を改行するのは、95%の場合において望ましいことです。
  2. の間の例のように、2 つのファイルの最終行と先頭行をマージすることができます。 b.txtc.txt ?

もちろん、これは ソルバブル を使用する必要があります。 cat をより複雑にする (位置指定コマンドライン引数を追加する、例. cat a.txt --no-newline b.txt c.txt を含む)、そして今度は コマンド は、個々のファイルではなく、他のファイルとの貼り合わせを制御します。これは、ほぼ間違いなく不便です。

... あるいは、終了ではなく継続させるべき行をマークするために、特別なセンチネル文字を導入する必要があります。この場合、POSIXと同じ状況に陥りますが、逆になっています(行終端文字ではなく行継続文字)。


<サブ では、オン POSIX非対応 ファイルは一般に改行で終わらないし、行の(非公式な)定義は、例えば「次のようなテキスト」かもしれません。 分離 改行で」(強調に注意)。これは全く妥当なことです。しかし、構造化されたデータ(プログラミング コードなど)については、解析が最小限に複雑になります。一般的には、パーサーを書き直さなければならないことを意味します。パーサーがもともとPOSIXの定義を念頭に置いて書かれている場合は、パーサーではなくトークンストリームを変更する方が簡単かもしれません。つまり、入力の最後に「人工改行」トークンを追加するのです。