web-dev-qa-db-ja.com

コマンドラインでdiffを色付けするにはどうすればいいですか?

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

444
daniel kullmann

diffのmanページはそれ自身の中から色付けの解決策を提案しません。 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
553
kaji

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
311
Johnsyweb

実際にはまだ別の選択肢があるようです(私が最近気付いたのは、上記の問題に遭遇したときです)。

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

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

158
Lars Baehren

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

これはほとんどのディストリビューションでのデフォルトのdiffの実装です。

Ubuntu 18.04はdiffutils 3.6を持っているのでそれを持っています。

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

enter image description here

テスト済み

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

明らかにcommit 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

結果:

enter image description here

行が狭すぎる場合(デフォルトは80桁)、次のようにしてscreenに合わせてください。

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

テストファイルの内容

ある

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 diffの代わりに、gitリポジトリの内側から、あなたはただすることができます:

ydiff -s

そしてgit logの代わりに:

ydiff -ls

参照: "git diff"を実行したときにどうやってサイドバイサイドの差分を取得することができますか?

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

そして、yum install colordiffapt-get install colordiffがあなたの直接のコントロールを超えたいくつかの非常識な制約のためにオプションではない場合、またはあなたはただ狂っているを感じることができます。 sedの行でホイールを発明します。

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

それをシェルスクリプトで投げて、unified diffoutputでそれを出力してください。

ハンクマーカーを青にし、新旧のファイル名をハイライトし、追加/削除した行をそれぞれ緑色と赤色の背景で強調表示します。1 そしてそれは後続スペースを作ります2 colordiffができるよりも明らかに変化が明白です。


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

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

67
retracile

Subversionの設定を変更してcolordiffを使うことができます

〜/ .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

16
Azd325

grc (Generic Colouriser)を使用します。これにより、diffを含む多数のコマンドの出力に色を付けることができます。

これはpythonスクリプトで、どんなコマンドでも囲むことができます。そのため、diff file1 file2を呼び出す代わりに、色付きの出力を見るためにgrc diff file1 file2を呼び出すことになります。簡単にするためにdiffgrc diffにエイリアスしました。

10
dogbane

色付き、ワードレベルdiff出力

これが下記のスクリプトと diff-highlight でできることです。

Coloured diff screenshot

#!/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

sedの強調表示に対する @ retracileの回答 の功績による)

10
Tom Hale

wdiffは挿入と削除の両方の始めと終わりに文字列を指定する引数を受け入れるので、それらの文字列としてANSIカラーシーケンスを使うことができます。

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

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

diff output of CSV files

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

5
jcomeau_ictx

これは、sedを呼び出して、色に適切なANSIエスケープシーケンスを挿入して、+-、および@の行をそれぞれ赤、緑、およびシアンで表示するものです。

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

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

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

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

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

enter image description here

これがtput setaftput 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
3
Susam Pal

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

あなたはそれをインストールすることができます:

Sudo npm install -g diff-so-fancy
1
Naveen