コマンドラインでdiffに色を付ける方法は?


503

差分がある場合、見栄えをよくするためにどのように色付けできますか?コマンドラインで使用したいので、GUIソリューションは使用しないでください。


6
特定のオペレーティングシステム/シェル?
Rowland Shaw、

4
github.com/walles/riffをお試しください。追加のボーナスとして、変更された行のどの部分が強調表示されます。
Johan Walles、2015

回答:


608

のマンページは、diffそれ自体からのカラー化の解決策を提案していません。の使用を検討してくださいcolordiff。これdiffは、読みやすくするために色付きの構文強調表示を使用して出力を補強することを除いて、diffと同じ出力を生成するラッパーです。

diff old new | colordiff

あるいは単に:

colordiff old new

インストール:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X:brew install colordiffまたはport install colordiff

45
ちょうど自分自身を見つけた:-)。less -R色のエスケープシーケンスを正しく表示するを使用して、lessにパイプすることができます。
ダニエルカルマン2012年

34
次の構文を使用できます:colordiff file1 file2
Felipe Alvarez

3
悲しいかな、それはサイドバイサイド出力-y有効にするオプション)では機能しません☹ vimdiff以下の提案はおそらくより良い方法です
Hi-Angel

8
colordiff適していますsvn diff | colordiff(つまり、あなたが唯一の差分を持っている状況では、2つのファイルは差分を取っていません)。
Cornstalks、2015年

8
@ Hi-Angelのコメントの更新として:colordiffが更新され、サイドバイサイド(-y)サポートが含まれるようになりました。
ベイリーパーカー、

333

Vimを使用:

diff /path/to/a /path/to/b | vim -R -

さらに良いことに、VimDiff(またはvim -d、タイプの方が短い)は、2つ、3つ、または4つのファイルの違いを並べて表示します。

例:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao:コマンドをエイリアスするよりも、コマンドを学ぶ方が好きです。そうすれば、ドットファイルが利用できない場合でも、どこでもそれらを使用できます。
Johnsyweb 2013

1
@AquariusPower:ctrl-cとはctrl-xVimの中の他の用途があります。ctrl-q多くの端末でキャプチャされます。ニーズに最も適した方法を見つけるには、書き込みと終了を参照してください。
Johnsyweb 2014年

1
まず、これはどんなシェルですか?zsh?構成がわかりません=(...)。第二に、私はdiff -ur a b念頭に置いていました。
x-yuri 2015


1
このソリューションは、システム管理者権限を持ち、追加のツールをインストールする必要がないため、承認された回答より優れています
amanzoor

173

実際には、さらに別のオプションがあるようです(私が最近気付いたのは、上記の問題が発生したときに)。

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Gitを使用している場合(既に使用している可能性があります)、ファイル自体がバージョン管理されていなくても、比較のためにGitを使用できます。デフォルトで有効になっていない場合、ここでカラーサポートを有効にすることは、前述の回避策のいくつかよりもかなり簡単なようです。


19
これはすばらしいですが、悲しいことに、入力がパイプの場合は機能しません。たとえば、バイナリファイルの比較は機能しgit diff <(xxd file1) <(xxd filed)ません。
マイケルアンダーソン

8
奇妙なことに、少なくとも1つのファイルが「現在のリポジトリの外」にある必要があると、は述べていgit help diffます。したがって、git diffが空cdになった場合は、どこにいるか試してください。
不正なリクエスト:

7
git diffの色を有効にするには:git config color.diff auto
JWhy

2
超シンプルで迅速
EE33

31
両方のファイルが現在のリポジトリ内にある場合は、を使用git diff --no-indexして2つのファイルを比較します。
Olivier 'Ölbaum' Scherler

95

diff --color オプションがGNU diffutils 3.4に追加されました(2016-08-08)

これは、diffほとんどのディストリビューションでのデフォルトの実装であり、間もなく導入されます。

Ubuntu 18.04にはdiffutils3.6が含まれているため、これが含まれています。

3.5では次のようになります。

ここに画像の説明を入力してください

テスト済み:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

どうやらコミットc0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)に追加されました。

単語レベルの相違

のようにdiff-highlight。可能ではないようです、機能のリクエスト:https : //lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

関連スレッド:

ydiff ただし、以下を参照してください。

ydiff 横並びの単語レベルの相違

https://github.com/ymattw/ydiff

これはニルヴァーナですか?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

結果:

ここに画像の説明を入力してください

行が狭すぎる場合(デフォルトは80列)、次のように画面に合わせます。

diff -u a b | ydiff -w 0 -s

テストファイルの内容:

a

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

b

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Git統合

ydiff 構成を必要とせずにGitと統合します。

の代わりにgitリポジトリ内からgit diff、次の操作を実行できます。

ydiff -s

の代わりにgit log

ydiff -ls

参照:「git diff」を実行するときに、どうすれば並べてdiffを取得できますか?

Ubuntu 16.04、git 2.18.0、ydiff 1.1でテスト済み。


ここにドキュメントがあります。
Alexey 2017

1
そのメーリングリストのスレッドで:There is no word-highlighting, yet-更新はありますか?これが私がこの質問に出てきた理由です(grep --color-like diff出力が必要です)。
i336_

@ i336_残念ながら更新はありません。もし何かあれば、質問を更新します。何か見つけたら私にpingしてください。
Ciro Santilli郝海东冠状病六四事件法轮功

ちなみにgit diff --color動作します。sshで作業するときに役立ちます。
Nagev

差分が大きすぎますか?使用diff --color=always | less -R
-inetphantom

69

そして、あなたの直接の制御を超える非常識な制約が原因でa yum install colordiffまたはan apt-get install colordiffがオプションではない場合、または単に気が狂っている場合は、sedの行でホイールを再発明できます。

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

それをシェルスクリプトにスローし、統合されたdiff出力をパイプします。

ハンクマーカーを青色にして、新しい/古いファイル名と追加/削除された行をそれぞれ緑色と赤色の背景で強調表示します。1 そして、末尾のスペース2の変更がcolordiffよりもすぐにわかります。


1ちなみに、ファイル名を変更された行と同じように強調表示する理由は、ファイル名と変更された行を正しく区別するために、正規表現に取り組むものではないdiff形式を適切に解析する必要があるためです。それらを同じように強調表示すると、視覚的に「十分に機能」し、問題は簡単になります。とはいえいくつかの興味深い微妙な点があります。

2しかし、末尾のタブではありません。どうやらタブは、少なくとも私のxtermでは、背景が設定されていないようです。ただし、タブとスペースの変更が少し目立ちます。


5
@マット:Macのブルートフォースアプローチは次のとおりです sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(より良い方法があると思いますが)。
2013

1
うーん、それはうまくいった...各チャンクの間に3つのダッシュをピンクの背景にした。
Matt Montag 2013

たとえば、色を簡単に変更するオプションがない、手作業で判読できない、メンテナンスできない方法。

1
これは素晴らしいです!行くぞ!それはいくつかの素晴らしいsedウィザードです。
fthinker 2013年

6
sed 's / ^-/ \ x1b [31m-/; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /'も見栄えが良い
Yura

16

colordiffを使用するようにsubversion設定を変更できます

〜/ .subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

経由:https : //gist.github.com/westonruter/846524


svn:プロセス 'colordiff'を開始できません:リソースが一時的に利用できません
niken

colordiffをインストールしましたか?
Azd325 16

うん、パスもハードコーディングしてみた(cygwinで実行)
niken

IDKの試してみてください。このsuperuser.com/questions/635995/...
Azd325

12

着色、単語レベルの diff出力に含ま

以下のスクリプトとdiff-highlightでできることは次のとおりです。

色付きの相違のスクリーンショット

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(強調表示のための@retracileの回答のクレジットsed


GVimでこの出力を使用するにはどうすればよいですか?
Hemant Sharma

についてはvimdiffcharなどのプラグインを使用します。
トム・ヘイル

10

私の使用grcあなたが含むコマンドの数の出力を着色することができます(ジェネリックColouriser)、 diff

任意のコマンドをラップできるpythonスクリプトです。したがって、を呼び出す代わりにdiff file1 file2grc diff file1 file2色付きの出力を表示するために呼び出します。簡単diffgrc diffするために別名を付けました。


fork()WSLで動作する可能性が高いですが、呼び出しのためにmingw / cygwinのあるWindowsでは動作しません。
Gabriel Devillers

6

ここで呼び出すことが別の解決策であるsed色を表示するための適切なANSIエスケープシーケンスを挿入する+-および@それぞれ、赤色、緑色、及びシアンのラインは。

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

この質問に対する他の解決策とは異なり、この解決策はANSIエスケープシーケンスを明示的に示していません。代わりに、tput setafおよびtput sgr0コマンドを呼び出して、ANSIエスケープシーケンスを生成し、それぞれ適切な色を設定し、端末属性をリセットします。

の各引数に使用できる色を確認するには、tput setaf次のコマンドを使用します。

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

出力は次のようになります。

ここに画像の説明を入力してください

tput setafand tput sgr0コマンドが適切なANSIエスケープシーケンスを生成するという証拠です。

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m

5

wdiffは挿入と削除の両方の最初と最後の文字列を指定する引数を受け入れるため、これらの文字列としてANSIカラーシーケンスを使用できます。

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

たとえば、これは2つのCSVファイルを比較した出力です。

CSVファイルの差分出力

https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.htmlの


1
colordiff現在(1.0.16)はを理解wdiffしているので、単にパイプすることもできます:wdiff -n f1 f2 | colordiffwdiffdiffutilsにマージする必要があります...
Ciro Santilli郝海东冠状病六四事件法轮功

3

diff-so-fancyを試してみることをお勧めします。私は仕事中にそれを使用し、今のところ確かに素晴らしいようです。それは多くのオプションが満載されており、あなたが望むようにあなたの差分を設定することは本当に簡単です。

次の方法でインストールできます。

sudo npm install -g diff-so-fancy

またはMacの場合:

brew install diff-so-fancy

その後、次のように差分を強調表示できます。

diff -u file1 file2 | diff-so-fancy


0

Ubuntuの最新バージョンのgitでは、次のコマンドでdiff-highlightingを有効にできます。

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

そして、これをあなたに追加します.gitconfig

[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

スクリプトが他のディストリビューションのどこかにある可能性があります。どこにあるかlocate diff-highlightを調べるために使用できます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.