diffについての覚え書き

今日はdiffについて調べたことを書くでふ。

diffとは

diffプログラムはファイルの比較を行うためのコマンドで、2つのファイル間の違いを出力できる。diffプログラムは行単位でテキストファイル間の差異を表示する。最近の実装では、バイナリファイルもサポートしている。

diff - Wikipedia

出力形式

二つのファイルの違いを表示する仕方には、標準の(伝統的な)形式、コンテキスト形式(context format)、ユニファイド形式(unified format)、その他さまざまなものがある。詳細はComparing and Merging Files: 2. diffの出力書式を参照のこと。個人的には、ユニファイド形式が一番見やすい。

コマンドラインで diff text1 text2 とすると、diffは、text1に変更を加えた結果のファイルがtext2であるという想定の下、その差分を表示するようである(実際は二つは無関係のファイルだったとしても)。よって、そのことを頭において出力を眺めると、分かりやすいと思われる。

以下、diffコマンドの出力行の末尾に適宜、 "#" によるコメントを付与することで簡単な解説を行う。

標準形式
$ cat text1
abc
def
ghi
jkl
$ cat text2
def
GHI
jkl
mno
pqr
$ diff text1 text2
1d0   # text1の1行目のabcはtext2では削除(d) (もし削除しなかったら、text2では0行目と次の行(1行目)との間にあるはずだった)
< abc
3c2   # text1の3行目のghiは、text2では2行目のGHIに変更(c)
< ghi
---
> GHI
4a4,5   # text1の4行目と次の行(5行目)との間に、text2の4-5行目を新たに追加(a)
> mno
> pqr
コンテキスト形式
 $ diff -c text1 text2   # -c でコンテキスト形式
*** text1       2009-03-17 17:51:04.000000000 +0900    #「*」はtext1(変更前)、「-」はtext2(変更後)を指すのに使う
--- text2       2009-03-17 17:51:25.000000000 +0900
***************
*** 1,4 ****    # text1の1行目から4行分のtext2での変更状況を以下に記述
- abc   # text2では削除
  def
! ghi   # text2では変更
  jkl
--- 1,5 ----   # text2の1行目から5行分のtext1からの変更状況を以下に記述
  def
! GHI   # text1から変更
  jkl
+ mno   # text1の当該位置に追加
+ pqr
ユニファイド形式
$ diff -u text1 text2   # -u でユニファイド形式
--- text1       2009-03-17 17:51:04.000000000 +0900   #「-」はtext1(変更前)、「+」はtext2(変更後)を指すのに使う
+++ text2       2009-03-17 17:51:25.000000000 +0900
@@ -1,4 +1,5 @@    # text1の1行目から4行分と、text2の1行目から5行分を以下で比較する、の意
-abc   # text1のこの行はtext2では削除された
 def   # 先頭がスペースの行は変更なし
-ghi
+GHI   # text2のこの行はtext1の当該位置に挿入された
 jkl
+mno
+pqr

参考リンク

man 1 diff - Linux Man Pages
diffのmanファイル。
diff - Wikipedia
diffの歴史やフォーマットの見方などの概要。
http://www.bookshelf.jp/texi/diff/diff-ja.html
diffや関連するコマンドによるファイルの比較、統合についての包括的で詳細な解説(原典)。
diffコマンドの使い方: UNIX/Linuxの部屋
コマンドの基本的な用法やオプション、パッチの当て方などの簡単な解説。