diffの差分形式比較 (unified, context, side-by-side, デフォルト, ed)

Last modified: 2019-04-06

ファイルの差分を取るdiffコマンドの出力形式は複数あり、ここではその形式ごとの違いを比較する。

unified形式

unified形式の例

--- sample.txt.orig     2007-06-24 11:39:04.107394831 +0900
+++ sample.txt  2007-06-24 12:14:25.822713856 +0900
@@ -5,10 +5,9 @@
 なにぬねの
 はひふへほ
 まみむめも
-やゆよ
-らりるれろ
+やゆよら
+りるれろ
 わをん
-がぎぐげご
 ざじずぜぞ
 だぢづでど
 ばびぶべぼ
@@ -23,6 +22,7 @@
 ヤユヨ
 ラリルレロ
 ワヲン
+ァィゥェォ
 ガギグゲゴ
 ザジズゼゾ
 ダヂヅデド

unified形式の説明

  • 最も広く使われている形式
  • 行頭が---の行は基準(元)のファイルの、+++で始まる行は比較するファイル(patchコマンドに渡した際に修正されるファイル)の名前とタイムスタンプ1が出力される
  • 行頭が@@の行では2つのファイルで内容が異なる行を含むテキストブロック(Hunk)の各ファイル内における範囲を示しつつ、そのブロックが次の行から開始されることを示す

各ブロック内は行単位で先頭の文字によって差分が

行の最初の文字 説明 patchコマンドの動作
+ (半角プラス) 元ファイルにこの内容を追加したものが比較ファイルとなる 追加
- (半角マイナス) 元ファイルからこの内容を削除したものが比較ファイルとなる 削除
半角スペース 修正箇所の周辺の内容 変更なし

上記の組み合わせで表現される。

unified以外の形式

context形式

context形式の例

*** sample.txt.orig     2007-06-24 11:39:04.107394831 +0900
--- sample.txt  2007-06-24 12:14:25.822713856 +0900
***************
*** 5,14 ****
  なにぬねの
  はひふへほ
  まみむめも
! やゆよ
! らりるれろ
  わをん
- がぎぐげご
  ざじずぜぞ
  だぢづでど
  ばびぶべぼ
--- 5,13 ----
  なにぬねの
  はひふへほ
  まみむめも
! やゆよら
! りるれろ
  わをん
  ざじずぜぞ
  だぢづでど
  ばびぶべぼ
***************
*** 23,28 ****
--- 22,28 ----
  ヤユヨ
  ラリルレロ
  ワヲン
+ ァィゥェォ
  ガギグゲゴ
  ザジズゼゾ
  ダヂヅデド

context形式の説明

  • 最初の2行2と差分(+-で始まる行)の表記はunified形式に近い
  • 異なる内容の行を含むテキストブロックの内容を各ファイルごとにそのまま続けて3並べていて、差分出力は長くなる
  • 行数が同じで内容の異なる行(のまとまり)は!で始まる

side-by-side形式

side-by-side形式の例

あいうえお    あいうえお
かきくけこ    かきくけこ
さしすせそ    さしすせそ
たちつてと    たちつてと
なにぬねの    なにぬねの
はひふへほ    はひふへほ
まみむめも    まみむめも
やゆよ      | やゆよら
らりるれろ  | りるれろ
わをん        わをん
がぎぐげご  <
ざじずぜぞ    ざじずぜぞ
だぢづでど    だぢづでど
ばびぶべぼ    ばびぶべぼ
ぱぴぷぺぽ    ぱぴぷぺぽ
アイウエオ    アイウエオ
カキクケコ    カキクケコ
サシスセソ    サシスセソ
タチツテト    タチツテト
ナニヌネノ    ナニヌネノ
ハヒフヘホ    ハヒフヘホ
マミムメモ    マミムメモ
ヤユヨ        ヤユヨ
ラリルレロ    ラリルレロ
ワヲン        ワヲン
            > ァィゥェォ
ガギグゲゴ    ガギグゲゴ
ザジズゼゾ    ザジズゼゾ
ダヂヅデド    ダヂヅデド
バビブベボ    バビブベボ
パピプペポ    パピプペポ

side-by-side形式の説明

  • 両方の内容を横に並べ、異なる行には記号が付く。 “違い” が分かりやすいが非常に長くなり、ファイル名などの情報はない
  • 片方にだけある行は不等号、行数が同じで内容が異なる行は|が付く

既定の形式

既定の形式の例

8,9c8,9
< やゆよ
< らりるれろ
---
> やゆよら
> りるれろ
11d10
< がぎぐげご
25a25
> ァィゥェォ

既定の形式の説明

  • diffコマンドで出力形式の指定を行わない場合に書き出される形式
  • 内容の異なる行の周辺の内容は含まず、内容の異なる部分の内容と位置のみ表記したもの
    • 差分の長さは前述の形式と比べて短いものになる
  • 異なるブロックの範囲は8,9c8,9のように表記される
  • unified形式の+の行に相当するのが<で始まる行、-の行に相当するのが>
  • 内容の異なる部分をそれぞれ続けて並べているのはcontext形式に近い

ed形式 (edスクリプト)

ed形式 (edスクリプト) の例

25a
ァィゥェォ
.
11d
8,9c
やゆよら
りるれろ
.

ed形式 (edスクリプト) の説明

  • 非対話でテキストを編集するedコマンドが解釈/実行できる形式(edスクリプト)
  • edコマンドによってパッチ当てができる(末尾にwコマンドを追加して渡す)
  • このedスクリプトを複数回実行すると変更対象ファイルは壊れる

diffコマンドが生成したedスクリプトの実行例

$ (cat [edスクリプト] && echo w) | ed - [パッチ対象ファイル]

  1. タイムスタンプ部分を削ってもpatchコマンドは動作する [return]
  2. 異なるのは1行目の最初が “***” であること [return]
  3. 片方にだけ含まれる内容に関するブロックは片方の内容だけとなる [return]