如何在命令行上为diff着色?


Answers:


607

手册页中diff没有建议从内部解决着色问题。请考虑使用colordiff。它是一个包装器diff,与diff产生相同的输出,不同之处在于它使用彩色语法突出显示来增强输出以提高可读性:

diff old new | colordiff

要不就:

colordiff old new

安装:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X:brew install colordiffport install colordiff

45
刚刚发现自己:-)。可以使用来将其减少,以less -R正确显示颜色的转义序列。
丹尼尔·库尔曼2012年

34
可以只使用语法:colordiff file1 file2
Felipe Alvarez

3
las,它不能用于并排输出-y启用选项)vimdiff below下面的建议可能是更好的方法
Hi-Angel 2014年

8
colordiff效果很好svn diff | colordiff(例如,在仅包含差异而不是两个文件被差异化的情况下)。
2015年

8
作为@ Hi-Angel的评论的更新:colordiff已更新,现在包括并排(-y)支持。
Bailey Parker

333

使用Vim

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

更好的是,VimDiff(或简称为VimDiffvim -d)将并排显示两个,三个或四个文件之间的差异。

例子:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao:我更喜欢学习命令,而不是给它们起别名。这样,即使我的点文件不可用,我也可以在任何地方使用它们。
Johnsyweb

1
@AquariusPower:ctrl-cctrl-x在Vim的其他用途。ctrl-q被许多终端捕获。请参阅撰写和退出以找到最适合您需求的方式。
Johnsyweb 2014年

1
首先,这是哪种外壳?zsh?我不认识=(...)构造。其次,我已经diff -ur a b牢记。
x-yuri 2015年

3
确实。在Zsh中,格式=(...)
Johnsyweb

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(无论如何您可能已经在使用它),那么即使文件本身不受版本控制,也可以将其用于比较。如果默认情况下未为您启用,那么在这里启用颜色支持似乎比前面提到的某些解决方法容易得多。


19
这很整洁,但可悲的是,当输入是管道时,这将无法正常工作。例如,通过比较二进制文件git diff <(xxd file1) <(xxd filed)不起作用。
迈克尔·安德森

8
奇怪的是,根据,至少其中一个文件必须位于“当前存储库之外” git help diff。因此,如果您的git diff变空了,请尝试cd您所在的位置。
错误的请求

7
为git diff启用颜色:git config color.diff auto
JW14年

2
超级简单,快捷
EE33,2015年

31
如果两个文件都在当前存储库中,请使用git diff --no-index来比较两个文件。
Olivier'Ölbaum'Scherler '15

94

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

测试文件的内容:

一个

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”时如何获得并排差异?

在Ubuntu 16.04,git 2.18.0,ydiff 1.1上进行了测试。


是文档。
Alexey

1
在该邮件列表线程中:There is no word-highlighting, yet-是否有任何更新?这就是我要问这个问题的原因(我想要grep --colordiff输出)。
i336_

@ i336_不幸的是,没有更新,如果有的话,我将更新问题。如果发现任何问题,请ping我。
西罗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/'

将其扔到一个shell脚本中,并通过它传递统一的diff输出。

它使块标记变成蓝色,并分别以绿色和红色背景突出显示新的/旧的文件名以及添加/删除的行。1 它将使尾随空间2的变化比colordiff更加容易显现。


1顺便说一句,突出显示文件名与修改后的行相同的原因是,要正确区分文件名和修改后的行需要正确解析diff格式,而使用正则表达式则无法解决。突出显示它们的效果在视觉上“足够好”,并使问题变得微不足道。也就是说,有一些有趣的微妙之处

2但不要尾随制表符。显然,至少在我的xterm中,选项卡没有设置背景。它确实使制表符与空间的更改脱颖而出。


5
@Matt:这是Mac的蛮力方法:( sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"尽管我希望有更好的方法)。
撤退

1
嗯,有点奏效了……给每块之间的3个破折号加了粉红色背景。
马特·蒙塔格

手动不可读,无法维护的方式,例如没有轻松更改颜色的选项。

1
杜德,这太棒了!要走的路!这是一些不错的sed巫术。
fthinker 2013年

6
sed's / ^-/ \ x1b [31m-/; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /']看起来也很棒
2015年

16

您可以更改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


svn:无法启动进程'colordiff':资源暂时不可用
niken

您安装了colordiff吗?
Azd325 '16

是的,我也尝试对路径进行硬编码(在cygwin中运行)
niken 2016年



10

我使用grc(通用选色器),它使您可以为包括在内的许多命令的输出着色diff

这是一个python脚本,可以包装在任何命令周围。因此diff file1 file2,您可以调用而不是调用grc diff file1 file2来查看彩色输出。我已经使用别名diff来简化grc diff它。


fork()尽管可能与WSL一起使用,但由于调用而无法在具有mingw / cygwin的Windows上使用。
加布里埃尔·德维勒斯

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 setaftput 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接受在插入和删除的开头和结尾都指定字符串的args,因此可以将ANSI颜色序列用作这些字符串:

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

例如,这是比较两个CSV文件的输出:

CSV文件的差异输出

来自https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html的示例


1
colordiff现在(1.0.16)可以理解了wdiff,所以您也可以只管道:wdiff -n f1 f2 | colordiffwdiff应该合并到diffutils ...
Ciro Santilli郝海东冠状病六四事件法轮功

3

我建议你给DIFF那么花哨一试。我在工作中使用它,到目前为止,它看起来确实不错。它包含许多选项,并且很容易以所需的方式配置差异。

您可以通过以下方式安装它:

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用来查找位置。


0

字符级颜色差异:安装ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

ccdiff的输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.