如何在命令行上着色diff?

时间:2012-01-10 08:49:10

标签: unix command-line colors diff

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

15 个答案:

答案 0 :(得分:547)

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

答案 1 :(得分:307)

使用Vim

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

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

示例:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

答案 2 :(得分:156)

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

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

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

答案 3 :(得分:67)

对于那些yum install colordiffapt-get install colordiff由于超出您的直接控制而导致的疯狂约束而无法选择的情况,或者您只是感到疯狂,你可以用一行sed重新发明轮子:

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

将它扔进shell脚本并通过它输出管道统一差异

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


1 顺便提一下,突出显示与修改行相同的文件名的原因是要正确区分文件名和修改后的行需要正确解析diff格式,这不是要解决的问题用正则表达式。突出显示它们同样在视觉上“足够好”并使问题变得微不足道。也就是说,有some interesting subtleties

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

答案 4 :(得分:66)

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

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

Word-level diff

diff-highlight。似乎不太可能,功能请求:https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

相关主题:

ydiff会这样做,见下文。

ydiff并排字级差异

https://github.com/ymattw/ydiff

这是Nirvana吗?

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'/ P>

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

另请参阅:How can I get a side-by-side diff when I do "git diff"?

在Ubuntu 16.04,git 2.18.0,ydiff 1.1。

上测试

答案 5 :(得分: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

via:https://gist.github.com/westonruter/846524

答案 6 :(得分:10)

我使用grc(Generic Colouriser),它允许您为包括diff在内的多个命令的输出着色。

这是一个可以包装任何命令的python脚本。因此,您不必调用diff file1 file2,而是调用grc diff file1 file2来查看颜色输出。我为diff添加了别名grc diff,以便更轻松。

答案 7 :(得分:10)

有色,字级 diff输出

您可以使用以下脚本和diff-highlight

执行此操作

Coloured diff screenshot

#!/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's answer

答案 8 :(得分:5)

由于wdiff接受在插入和删除的开头和结尾指定字符串的args,因此可以使用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

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

的示例

答案 9 :(得分:2)

这里是另一种解决方案,它调用sed插入适当的ANSI转义序列以获取颜色,以用红色,绿色,和青色。

+

与该问题的其他解决方案不同,该解决方案未明确说明ANSI转义序列。而是调用-@命令来生成ANSI转义序列,分别设置适当的颜色和重置终端属性。

要查看diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/" 的每个参数的可用颜色,请使用以下命令:

tput setaf

输出内容如下:

enter image description here

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

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
tput setaf
tput sgr0
$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m

答案 10 :(得分:1)

使用bat命令:

diff file1 file2 | bat -l diff

答案 11 :(得分: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找出位置。

答案 12 :(得分:0)

字符级色差: 安装ccdiff

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

Output of ccdiff

答案 13 :(得分:0)

对我来说,我找到了一些解决方案:it is a working solution

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

答案 14 :(得分:0)

我最喜欢的选择是 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) 中,然后使用 差异

示例

enter image description here 结果是 enter image description here