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

Unix 如何在命令行上为diff着色?,unix,command-line,colors,diff,Unix,Command Line,Colors,Diff,当我有一个diff时,我如何给它上色使它看起来很好?我希望它用于命令行,因此请不要使用GUI解决方案。diff的手册页建议不要从内部使用着色解决方案。请考虑使用 Copdiff

当我有一个diff时,我如何给它上色使它看起来很好?我希望它用于命令行,因此请不要使用GUI解决方案。

diff的手册页建议不要从内部使用着色解决方案。请考虑使用<代码> Copdiff<<代码>。它是一个围绕
diff
的包装器,产生与diff相同的输出,只是它使用彩色语法突出显示来增强输出,以增加可读性:

diff old new | colordiff
或者只是:

colordiff old new

安装:

  • Ubuntu/Debian:
    sudo-apt-get-install-colordiff
  • OS X:
    brew安装colordiff
    端口安装colordiff
使用:

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

示例:
我使用(通用着色器),它允许您对许多命令的输出进行着色,包括
diff


它是一个python脚本,可以围绕任何命令进行包装。因此,您可以调用
grc diff file1 file2
,而不是调用
diff file1 file2
,以查看彩色输出。我已将
diff
化名为
grc diff
,以简化操作。

对于
yum-install-colordiff
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中是这样。不过,它确实使选项卡与空间的更改显得有些突出。

您可以将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:

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

git diff——无索引
#输出到控制台,而不是打开寻呼机
git--无寻呼机差异--无索引
如果您有Git(您可能已经在使用它),那么您将能够使用它进行比较,即使文件本身不受版本控制。如果默认情况下没有为您启用,那么在这里启用颜色支持似乎比前面提到的一些解决方法要容易得多。

彩色、字级
diff
output

以下是您可以使用以下脚本执行的操作:


(由于
sed
突出显示,这归功于)

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

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2
例如,这是比较两个CSV文件的输出:

GNU diffutils 3.4(2016-08-08)

这是大多数发行版的默认
diff
实现,很快就会得到它

Ubuntu18.04有
diffutils
3.6,因此有了它

在3.5中,它看起来是这样的:

diff -u file1 file2 | diff-so-fancy

通过以下方式进行测试:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')
结果:

如果行太窄(默认为80列),请使用以下选项适合屏幕:

diff -u a b | ydiff -w 0 -s
测试文件的内容:

a

b

ydiff
Git集成

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

在git存储库中,您只需执行以下操作,而无需执行git diff:

ydiff -s
而不是
git log

ydiff -ls
另见:


在Ubuntu 16.04、git 2.18.0、ydiff 1.1上测试。

我建议您试一试。我在工作中使用它,到目前为止,它看起来确实很棒。它附带了许多选项,并且很容易按照您想要的方式配置您的差异

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

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 setaf
tput sgr0
命令来生成ANSI转义序列,分别设置适当的颜色和重置端子属性

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

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
以下是输出的外观:

以下是
tput setaf
tput sgr0
命令生成适当ANSI转义序列的证据:

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m

在Ubuntu上最新版本的git上,您可以通过以下方式启用差异突出显示:

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

命令:


字符级颜色差异: 安装


我找到了一些解决方案:

@ech
diff -u file1 file2 | diff-so-fancy
diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"
for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo
$ 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
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
[pager]
    log = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less
diff file1 file2 | bat -l diff
ccdiff -r /usr/share/dict/words /tmp/new-dict
     @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