如何在命令行上着色diff?

dan*_*ann 475 unix diff command-line colors

当我有差异时,我怎样才能将它着色以使其看起来很好?我希望它用于命令行,所以请不要使用GUI解决方案.

kaj*_*aji 587

手册页diff建议没有内部着色的解决方案.请考虑使用colordiff.它是一个包装器diff,产生与diff相同的输出,除了它使用彩色语法高亮增强输出以增加可读性:

diff old new | colordiff
Run Code Online (Sandbox Code Playgroud)

要不就:

colordiff old new
Run Code Online (Sandbox Code Playgroud)

安装:

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

  • 刚发现自己:-).它可以通过使用`less -R`来管道输入更少,它可以正确显示颜色的转义序列. (43认同)
  • 可以使用语法:colordiff file1 file2 (34认同)
  • `colordiff`适用于`svn diff | colordiff`(即在你只有diff的情况下,而不是两个文件被分开). (7认同)
  • 作为对@ Hi-Angel评论的更新:colordiff已经更新,现在包括并排('-y`)支持. (6认同)
  • 唉,它并不适用于并排输出*(启用`-y`选项)*below下面的'vimdiff`建议可能是一种更好的方法 (3认同)
  • 他们现在使用`--color`:http://stackoverflow.com/a/41770560/895245 (3认同)

Joh*_*web 324

使用Vim:

diff /path/to/a /path/to/b | vim -R -
Run Code Online (Sandbox Code Playgroud)

或者更好的是,VimDiff(vim -d或更短的类型)将并排显示两个,三个或四个文件之间的差异.

例子:

vim -d /path/to/[ab]
Run Code Online (Sandbox Code Playgroud)
vimdiff file1 file2 file3 file4
Run Code Online (Sandbox Code Playgroud)

  • @Jichao:我更喜欢学习命令而不是别名.这样我就可以在任何地方使用它们,即使我的dotfiles不可用. (5认同)
  • 确实.在Zsh中,[`=(...)`形式的命令被替换为包含其输出的_file_的名称.](http://zsh.sourceforge.net/Intro/intro_7.html) (2认同)

小智 165

实际上似乎还有另一种选择(我最近才注意到,当遇到上述问题时):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>
Run Code Online (Sandbox Code Playgroud)

如果您有Git(您可能已经在使用它),那么您将能够使用它进行比较,即使文件本身不受版本控制.如果默认情况下没有为您启用,那么在此处启用颜色支持似乎比前面提到的一些解决方法容易得多.

  • 如果两个文件都在当前存储库中,请使用`git diff --no-index`来比较两个文件. (31认同)
  • 这很整洁,但遗憾的是,当输入是管道时,这不起作用.例如,通过`git diff <(xxd file1)<(xxd filed)`比较二进制文件不起作用. (19认同)
  • 奇怪的是,根据`git help diff`,至少有一个文件必须在"当前存储库之外".因此,如果您的git diff出现空,请尝试`cd`. (8认同)
  • 为git diff启用颜色:`git config color.diff auto` (7认同)
  • 超级简单快捷 (2认同)
  • 我是`git diff --word-diff --patience`的粉丝 (2认同)

Cir*_*四事件 87

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/')
Run Code Online (Sandbox Code Playgroud)

显然在commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)中添加.

我还要求提供word level diff,如下所示diff-highlight:https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

  • 差异太大?使用 `diff --color=always | 少-R` (3认同)

ret*_*ile 69

而对于那些场合,当一个yum install colordiffapt-get install colordiff不是一种选择,由于超出你的直接控制一些疯狂的约束,或者你只是感到疯狂,你可以重新发明了线的sed轮:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'
Run Code Online (Sandbox Code Playgroud)

把它扔进shell脚本并通过它管道统一diff输出.

它使hunk标记变为蓝色,并分别突出显示新/旧文件名以及绿色和红色背景中添加/删除的行.1 它将使跟踪空间2的变化比colordiff更明显.


1顺便提一下,突出显示与修改行相同的文件名的原因是,要正确区分文件名和修改后的行,需要正确解析diff格式,这不是正则规则要解决的问题.突出显示它们同样在视觉上"足够好"并使问题变得微不足道.也就是说,有一些有趣的细微之处.

2但不是尾随标签.显然,标签不会得到他们的背景设置,至少在我的xterm中.它确实使标签与空间变化有点突出.

  • sed's/^ - /\x1b [31m - /; s/^ + /\x1b [32m + /; s/^ @ /\x1b [34m @ /; s/$ /\x1b [0m /'看起来也很棒 (6认同)
  • @Matt:这是Mac的蛮力方法:`sed's/^ - /\`echo -e \"\ x1b \"\`[41m - /; s/^ +/\`echo -e\"\ x1b \"\`[42m + /; s/^ @/\`echo -e \"\ x1b \"\`[34m @ /; s/$/\`echo -e \"\ x1b \"\ `[0m /"`(虽然我希望有更好的方法). (5认同)
  • 哥们这太棒了!加油!这是一些不错的 sed 魔法。 (2认同)

Azd*_*325 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
Run Code Online (Sandbox Code Playgroud)

来自:https://gist.github.com/westonruter/846524


dog*_*ane 10

我使用grc(Generic Colouriser),它允许你为许多命令的输出着色,包括diff.

它是一个python脚本,可以包装任何命令.因此diff file1 file2,您可以调用grc diff file1 file2以查看颜色输出,而不是调用.我有别名diff,grc diff以使它更容易.


Tom*_*ale 10

彩色,字级 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
Run Code Online (Sandbox Code Playgroud)

(感谢@ retracilesed突出显示的回答)


Jon*_*hoi 7

到目前为止还没有人提到过Delta 。它支持带有语法突出显示的语法彩色差异视图。

图片来源:达美航空


jco*_*ctx 5

由于wdiff接受args在插入和删除的开头和结尾指定字符串,因此可以使用ANSI颜色序列作为这些字符串:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
Run Code Online (Sandbox Code Playgroud)

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

diff文件的输出

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


Sus*_*Pal 5

下面是另一种解决方案,它调用sed插入相应的ANSI转义序列为颜色来显示+-@在红色,绿色和青色线,分别。

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

与该问题的其他解决方案不同,此解决方案没有明确说明ANSI转义序列。相反,它调用tput setaftput sgr0命令来生成ANSI转义序列以分别设置适当的颜色和重置终端属性。

要查看的每个参数的可用颜色tput setaf,请使用以下命令:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
Run Code Online (Sandbox Code Playgroud)

这是输出的样子:

在此处输入图片说明

这是tput setafand tput sgr0命令生成适当的ANSI转义序列的证据:

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


归档时间:

查看次数:

160285 次

最近记录:

6 年 前