結論
Linuxでは改行はLFであり、CRは改行として扱わない(当然)
diff
コマンドでは違いを行ごとに判定するが、
--strip-trailing-cr
オプションで改行の違いを無視できる(という解説を目にする)。
しかし、依然としてCRは改行扱いされず、
CRで改行されたファイルは、diff
でうまく差分を取れない。
なので、nkf
コマンドなどで、改行文字を置換しなければ、行単位での比較ができない。
ほんのすこし気合を入れて、--strip-trailing-cr
という三単語を読み解けば、このオプションの正しい動作が読み取れる。
--strip-trailing-cr
は決して、「LinuxでもCRを改行として扱えるオプション」ではない。
LFで改行されたファイルとCRLFで改行されたファイルを比較するためのオプションと覚えておくと吉。
というよりもmanの解説そのままで覚えるとなおいい。
そもそも、主語は「Linux」ではなく「比較する2つのファイル」である…
CRのみを安易に改行と捉えるのは広義すぎて今回のような誤解を招く?
経緯
wget
で取得したページの差分を定期的に取ろうとしたところ、差分がうまく取れていない。
違いがあることは検出できているが、どうやら対象行のみならず、
全体が異なると判定されているらしい。
すわ改行コードがCRのせいかと改行コードの違いを無視するオプションを付加するも、効果なし。
結局改行コードをLFに変換すると、無事差分を抽出できた。
が、なぜ改行コードの違い(≒LFでない)を無視できなかったのかと訝しむ。
参考記事
改行コード無視してdiff
-
diffで改行コードを無視 - ひとりごと
上記の引用元。こちらでは正しくCRLFとLFの差分を無視したいとある。 -
Vim - 改行コード、空白、改行を無視してdiffを取る - Qiita
今読み返すと対象コードがCRLFだと読み取れるが、当時は思い至らなかった。
改行コードを無視する
改行コードが違う
改行コードを無視する方法
改行コード無視オプションを使えばいいらしい.
diffで空行と改行コードを無視する方法
その他いろいろ
行末の CR を取り除く。 行末のマーカとして CRLF を使うシステムの出力を処理するときに役立つ。
公式(そのままのテキスト)が結局一番わかり易いという。
間違っている記事が多い、というわけではなく、一般認識として、
改行コード = LF と CRLF のみ
という感じになっている気がする。
自身も今回はじめてCRファイルを扱ったし。
よって、文脈として異なる・無視という言葉も、**CRLFである・CRを無視(してLFとして扱う)**と読まなければならない。
検証
CRで改行したファイルのdiff
結果
a
b
c
d
e
a
B
c
d
e
@@ -1,5 +1,5 @@
a
-b
+B
c
d
e
\ No newline at end of file
# diff b B -u
--- b 2015-11-04 14:28:00.000000000 +0900
+++ B 2015-11-04 14:27:53.000000000 +0900
@@ -1 +1 @@
ea
\ ファイル末尾に改行がありません
ea
\ ファイル末尾に改行がありません
# diff b B -u --strip-trailing-cr
--- b 2015-11-04 14:28:00.000000000 +0900
+++ B 2015-11-04 14:27:53.000000000 +0900
@@ -1 +1 @@
ea
\ ファイル末尾に改行がありません
ea
\ ファイル末尾に改行がありません