如何在命令行上色差异

当我有一个差异时,我如何给它上色,使它看起来更好?

我想它的命令行,所以请没有GUI解决方案。

224498 次浏览

diff的手册页不建议从内部进行着色。请考虑使用colordiff。它是一个围绕diff的包装器,产生与diff相同的输出,除了它使用彩色语法突出显示来增强输出以增加可读性:

diff old new | colordiff

或者是:

colordiff old new

安装:

  • Ubuntu / Debian: # EYZ0
  • OS X: brew install colordiffport install colordiff

使用# EYZ0:

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

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

例子:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

我使用grc(通用着色器),它允许您对包括diff在内的许多命令的输出进行着色。

它是一个Python脚本,可以封装在任何命令中。因此,不是调用diff file1 file2,而是调用grc diff file1 file2来查看着色的输出。我有别名diffgrc diff使它更容易。

yum install colordiffapt-get install colordiff由于一些超出你直接控制的疯狂约束而不是一个选项时,或者你只是感觉疯了,你可以用一行sed来重新发明轮子:

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

把它扔到一个shell脚本中,并通过它输出统一的diff

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


顺便说一句,突出显示与修改行相同的文件名的原因是,要正确区分文件名和修改行,需要正确解析diff格式,这不是用正则表达式可以解决的问题。把同样的作品“足够好”地突出来;使问题变得简单。也就是说,有一些有趣的微妙之处

但不是尾随制表符。显然标签没有得到他们的背景设置,至少在我的xterm。它确实使制表符与空格的变化脱颖而出。

你可以改变颠覆配置来使用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

通过:# EYZ0

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

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

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

彩色,word-level diff输出

下面是你可以用下面的脚本和diff-highlight做的事情:

 colored diff截图

#!/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 @retracile's answer for sed高亮显示)

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

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

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

diff output of CSV files

来自2.2 wdiff使用实例的例子。

diff --color选项(在2016-08-08添加到GNU diffutils 3.4)

这是大多数发行版上默认的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/')

显然是在提交c0fa19fe92da71404f809aafb5f51cfd99b1bee2(2015年3月)中添加的。

也能进行比较

像# EYZ0。这似乎是不可能的,但有一个功能要求:https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

相关问题:

  • Using 'diff'(或其他任何东西)来获取文本文件之间的字符级差异
  • https://unix.stackexchange.com/questions/11128/diff-within-a-line < a href = " https://unix.stackexchange.com/questions/11128/diff-within-a-line " > < / >
  • https://superuser.com/questions/496415/using-diff-on-a-long-one-line-file < a href = " https://superuser.com/questions/496415/using-diff-on-a-long-one-line-file " > < / >

ydiff做到了。见下文。

ydiff并排的单词水平差异

https://github.com/ymattw/ydiff

这是涅槃吗?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

结果:

Enter image description here

如果行太窄(默认为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 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

ydiff Git集成

ydiff与Git集成,无需任何配置。

在Git存储库中,你可以做的不是git diff,而是:

ydiff -s

而不是git log:

ydiff -ls

参见:当我做“;git diff"”时,我怎么能得到一个并排的差异?< / >

Ubuntu 16.04 (Xenial Xerus), Git 2.18.0和ydiff 1.1上测试。

我建议你试一下diff-so-fancy。我在工作中使用它,现在看起来确实很棒。它提供了许多选项,非常容易配置你想要的差异。

你可以通过以下方法安装:

sudo npm install -g diff-so-fancy

或者在Mac上:

brew install diff-so-fancy

然后,你可以像这样突出你的差异:

diff -u file1 file2 | diff-so-fancy

下面是另一个解决方案,它调用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

下面是输出的样子:

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

在Ubuntu上的最新版本的Git中,你可以通过以下方式启用diff-highlight:

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

使用蝙蝠命令:

diff file1 file2 | bat -l diff

字符级颜色差异: 安装# EYZ0 < / p >

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

Output of ccdiff

对我来说,我找到了一些解决方案:这是一个可行的解决方案

Enter image description here

@echo off
Title a game for YouTube
explorer "https://thepythoncoding.blogspot.com/2020/11/how-to-echo-with-different-colors-in.html"
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
echo say the name of the colors, don't read


call :ColorText 0a "blue"
call :ColorText 0C "green"
call :ColorText 0b "red"
echo(
call :ColorText 19 "yellow"
call :ColorText 2F "black"
call :ColorText 4e "white"


goto :Beginoffile


:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof


:Beginoffile

我最喜欢的选择是vdiff <file1> <file2>函数(我忘了从哪里得到它)。

它将在Vim中并排打开两个窗口,以清楚地看到两个文件之间的差异。

vdiff () {
if [ "${#}" -ne 2 ] ; then
echo "vdiff requires two arguments"
echo "  comparing dirs:  vdiff dir_a dir_b"
echo "  comparing files: vdiff file_a file_b"
return 1
fi


local left="${1}"
local right="${2}"


if [ -d "${left}" ] && [ -d "${right}" ]; then
vim +"DirDiff ${left} ${right}"
else
vim -d "${left}" "${right}"
fi
}
把这个脚本放在你的(.alias)或(.zshrc)中,然后调用它using vdiff & lt; file1>& lt; file2> . < / p >

例子

Enter image description here

结果如下:

Enter image description here

到目前为止,还没有人提到δ。它支持语法彩色差异视图与语法高亮显示

Image source: Delta