How to colorize diff on the command line?
当我有差异时,我怎样才能给它上色,使它看起来很好?我希望它用于命令行,所以请不要使用GUI解决方案。
1 | diff old new | colordiff |
或者只是:
1 | colordiff old new |
号
安装:
- Ubuntu/Debian:
sudo apt-get install colordiff 。 - OS X:
brew install colordiff 或port install colordiff 。
使用VIM:
1 | diff /path/to/a /path/to/b | vim -R - |
或者更好的是,vimdiff(或
1 | vim -d /path/to/[ab] |
。
1 | vimdiff file1 file2 file3 file4 |
实际上,似乎还有另一种选择(我最近才注意到,当遇到上述问题时):
1 2 3 | git diff --no-index <file1> <file2> # output to console instead of opening a pager git --no-pager diff --no-index <file1> <file2> |
如果您有Git(不管怎样,您可能已经在使用它),那么您将能够使用它进行比较,即使文件本身不受版本控制。如果默认情况下没有为您启用,那么在这里启用颜色支持似乎比前面提到的一些解决方法要容易得多。
GNU Diffutils 3.4(2016-08-08)增加了
这是大多数发行版上默认的
Ubuntu 18.04有
在3.5中,它看起来是这样的:
。
已测试:
1 2 3 | diff --color -u \ <(seq 6 | sed 's/$/ a/') \ <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/') |
显然加入了Commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)。
字级差异
像
相关线程:
- 使用"diff"(或其他任何方法)获取文本文件之间的字符级别diff
- https://unix.stackexchange.com/questions/11128/diff-within-a-line
- https://superuser.com/questions/496415/using-diff-on-a-long-one-line-file
不过,
网址:https://github.com/ymattw/ydiff
这是涅盘吗?
1 2 | python3 -m pip install --user ydiff diff -u a b | ydiff -s |
号
结果:
氧化镁
如果行太窄(默认为80列),则适合屏幕:
1 | diff -u a b | ydiff -w 0 -s |
测试文件的内容:
一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
。
乙
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 |
从Git存储库中,您可以执行以下操作,而不是从
1 | ydiff -s |
。
而不是
1 | ydiff -ls |
。
另请参见:当我执行"git diff"时,如何获得并排diff?
在Ubuntu 16.04、Git 2.18.0、YDiff 1.1上测试。
在那些情况下,当一个
1 | sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/' |
。
将其放入shell脚本,并通过它传输统一的diff输出。
它使大块标记变蓝,并分别突出新/旧文件名和在绿色和红色背景中添加/删除的行。1,它将使尾部空格2的变化比colordiff更明显。
1顺便说一下,突出显示与修改行相同的文件名的原因是为了正确区分文件名和修改行,需要正确分析diff格式,这不是regex要解决的问题。将它们突出显示在视觉上"足够好"并使问题变得微不足道。也就是说,有一些有趣的微妙之处。
2个,但不是尾随标签。显然,选项卡没有设置背景,至少在我的xterm中没有。不过,这确实让标签和空间的变化有点突出。
您可以将Subversion配置更改为使用ColorDiff
~/.Subversion/配置差异
1 2 3 4 5 | ### 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
彩色,字级
下面是您可以使用以下脚本和diff highlight执行的操作:
。
1 2 3 4 5 6 7 | #!/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 |
。
(credit to@retraccile's answer for the
我使用
它是一个python脚本,可以环绕任何命令。因此,您不需要调用
由于
1 | wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2 |
例如,这是比较两个csv文件的输出:
氧化镁
示例来自https://www.gnu.org/software/wdiff/manual/html_node/wdiff-examples.html
这里还有另一种解决方案,它调用
1 | diff -u old new | sed"s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/" |
。
与此问题的其他解决方案不同,此解决方案不会显式拼写出ANSI转义序列。相反,它调用
要查看
1 | for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo |
以下是输出的外观:
氧化镁
这里有证据表明,
1 2 | $ tput setaf 1 | xxd -g1 00000000: 1b 5b 33 31 6d .[31m |
。
1 2 | $ tput setaf 2 | xxd -g1 00000000: 1b 5b 33 32 6d .[32m |
号
1 2 | $ tput setaf 6 | xxd -g1 00000000: 1b 5b 33 36 6d .[36m |
号
1 2 | $ tput sgr0 | xxd -g1 00000000: 1b 28 42 1b 5b 6d .(B.[m |
号
我建议你试一试。我在工作中使用它,到目前为止它看起来确实很棒。它包含许多选项,并且很容易按照您想要的方式配置差异。
您可以通过以下方式安装:
1 | sudo npm install -g diff-so-fancy |