LoginSignup
3
4

More than 5 years have passed since last update.

Linuxでのdiffの「改行文字の違いを無視する」は改行文字の違いを無視しないという勘違い 【--strip-trailing-cr】

Posted at

:ballot_box_with_check: 結論

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でない)を無視できなかったのかと訝しむ。

参考記事

その他いろいろ


行末の CR を取り除く。 行末のマーカとして CRLF を使うシステムの出力を処理するときに役立つ。

公式(そのままのテキスト)が結局一番わかり易いという。

間違っている記事が多い、というわけではなく、一般認識として、
改行コード = LF と CRLF のみ
という感じになっている気がする。
自身も今回はじめてCRファイルを扱ったし。
よって、文脈として異なる・無視という言葉も、CRLFである・CRを無視(してLFとして扱う)と読まなければならない。

検証

CRで改行したファイルのdiff結果

b

a
b
c
d
e

B

a
B
c
d
e

WinMerge

@@ -1,5 +1,5 @@
 a
-b
+B
 c
 d
 e
\ No newline at end of file

linux_diff
# 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
\ ファイル末尾に改行がありません


3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4