差分があるとき、どのように色付けして見栄えを良くすることができますか?コマンドライン用にしたいので、GUIソリューションは絶対にしないでください。
diff
のmanページはそれ自身の中から色付けの解決策を提案しません。 colordiff
の使用を検討してください。読みやすさを向上させるために色付きの構文強調表示を使用して出力を補強することを除いて、diffと同じ出力を生成するdiff
のラッパーです。
diff old new | colordiff
あるいは単に:
colordiff old new
インストール:
Sudo apt-get install colordiff
brew install colordiff
またはport install colordiff
実際にはまだ別の選択肢があるようです(私が最近気付いたのは、上記の問題に遭遇したときです)。
git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
もしあなたがGitを持っているなら(それはとにかくすでに使っているかもしれません)、たとえファイル自体がバージョン管理下になくても、それを比較のために使うことができます。デフォルトで有効になっていない場合は、ここでカラーサポートを有効にすると、前述の回避策よりもはるかに簡単になります。
diff --color
オプションがGNU diffutils 3.4に追加されました(2016-08-08)
これはほとんどのディストリビューションでのデフォルトのdiff
の実装です。
Ubuntu 18.04はdiffutils
3.6を持っているのでそれを持っています。
3.5では、このようになります。
テスト済み
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
結果:
行が狭すぎる場合(デフォルトは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 colordiff
やapt-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では、どうやらタブの背景は設定されていないようです。ただし、タブとスペースの変更は少し際立っています。
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
grc
(Generic Colouriser)を使用します。これにより、diff
を含む多数のコマンドの出力に色を付けることができます。
これはpythonスクリプトで、どんなコマンドでも囲むことができます。そのため、diff file1 file2
を呼び出す代わりに、色付きの出力を見るためにgrc diff file1 file2
を呼び出すことになります。簡単にするためにdiff
をgrc diff
にエイリアスしました。
色付き、ワードレベル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
(sed
の強調表示に対する @ retracileの回答 の功績による)
wdiff
は挿入と削除の両方の始めと終わりに文字列を指定する引数を受け入れるので、それらの文字列としてANSIカラーシーケンスを使うことができます。
wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
たとえば、これは2つのCSVファイルを比較した出力です。
例 https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html
これは、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
出力は次のようになります。
これがtput setaf
と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
diff-so-fancy を試してみることをお勧めします。私は私の仕事の間にそれを使います、そしてそれは確かに今のところ素晴らしいようです。それは多くのオプションが満載されていて、あなたが望むようにあなたの差分を設定することは本当に簡単です。
あなたはそれをインストールすることができます:
Sudo npm install -g diff-so-fancy