diffコマンドでファイル全体を表示する

2014.08.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
今日は皆さん大好きdiffコマンドについて、便利な技を初めて知ったので残しておきます。

ファイル全体を表示する

diffは2つのテキストファイルの差分を表示してくれる大変便利なコマンドです。普通にdiffを利用すると差分のある行のみ、unified diff(-uオプション)を利用すると差分のあった行から前後3行が表示されます。

$ cat a.txt
1
2
3
4
5
6
7
8
9
10
$ cat b.txt
1
2
3
4
4
6
7
8
9
10
$ diff a.txt b.txt
5c5
< 5
---
> 4
$ diff -u a.txt b.txt
--- a.txt	2014-08-30 17:53:31.000000000 +0900
+++ b.txt	2014-08-30 17:53:44.000000000 +0900
@@ -2,7 +2,7 @@
 2
 3
 4
-5
+4
 6
 7
 8

上記の例だとあまり旨味がありませんが、ソースコードのdiffをとっている時などには「あれ、これどのメソッドだ?」ってなることもあると思います。そんな時にはファイル全体を表示して、差分のある行をマークしてくれると嬉しいですよね。

調べていたところ、参考資料に書いたサイトに答えがまるごと書いてありました。以下の方法で実現できます。

diff --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L' file1 file2

--new-line-formatなどのオプションで、それぞれの行に対しての表示形式を指定しています。そのなかで--unchanged-line-formatを指定することで、差分のない行も表示できます。

長いのでalias登録しておくとよいでしょう。

$ alias wholediff="diff --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L'"

上の例で試してみると、ファイル全体が表示されることが確認できました。

$ wholediff a.txt b.txt
 1
 2
 3
 4
-5
+4
 6
 7
 8
 9
 10

参考資料