如何比较色差输出?


18

我想有条件地格式化Unix文件,我目前正在处理diff命令,并且想知道是否可以格式化文本文件。diff命令输出。

例:

匹配的值应显示为绿色。
不匹配的值应显示为红色。

假设我有两个文件file1file2并且我的命令是diff file1 file2

现在我想假设输出包含5个不匹配项,那么这些不匹配项应以红色显示。如何使用unix实现?

简而言之,“对于不匹配的值,将diff命令的输出颜色更改为红色”


2
可能重复这个
FloHimself

术语“ match”和“ mismach”有点令人困惑。无论如何,在diff 3.4及更高版本中现在有了--color选项。
Gerry Lufwansa

Answers:


24

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

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

在3.5上看起来像这样:

在此处输入图片说明

与:

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

我还从diff-highlight以下位置请求单词级别diff :[Diffutils-devel]添加一个标志以生成彩色输出,例如git的diff-h | listing.gnu.org

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


1
优秀!默认情况下要启用此功能: alias diff='diff --color=auto'
Tom Hale

1
是文档。
Alexey'4

19

如果可以访问GNU diff,则可以使用其--X-group-format选项来获得这种效果,而无需任何其他工具:

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

它使用ANSI颜色转义码来获取红色和绿色,外壳中的ANSI-C引号用于访问\e转义。

--old-group-format--new-group-format识别非匹配线和用红和色复位码之间插入它们%<%>,而--unchanged-group-format插入件匹配绿色和复位码之间的线。

您也可以使用--old-line-format(ETC),在冗余颜色逃逸的费用在每一行:--old-line-format=$'\e[0;31m%L\e[0m'


当我运行时,它给出了差异:0653-821非法选项--差异:0653-821非法选项-o差异:0653-821非法选项-d差异:0653-821非法选项--差异:0653-821非法选项-g差异:0653-821非法选项-o类似错误。
阿曼2015年

Hormer当我一次以一行的形式运行您的命令时,它没有给新行输出-bash-4.2 $ --new-group-format = $'\ e [0; 31m%> \ e [0m'\ >
阿曼2015年

我可以默认配置吗?
Eugen Konkov '18

@EugenKonkov您可以在Shell中设置一个别名或函数来为其运行别名diff
迈克尔·荷马,

这给我尝试使其工作带来了一些麻烦。不变的东西显示为添加...放弃并安装了colordiff
Brian Peterson

9

尝试 colordiff file1 file2

Linux / BSD发行版中colordiff的可用性

那些运行Debian或Ubuntu(或它们的任何派生产品)的人可能只需要使用“ apt-get install colordiff”来下载和安装即可。colordiff还打包用于许多其他Linux,UNIX和BSD发行版和操作系统。

(摘自http://www.colordiff.org/


1
完善。对我来说,diff --color=auto只有彩色标记和每个+/ -部分的第一行。通过管道less -SR可以轻松浏览。
沃尔夫

4

彩色字级 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

(感谢@ retracile的回答sed高亮)


1

您应该看看hlgithub git clone http://github.com/mbornet-hl/hl 上可用的命令:和:http : //www.flashnux.com/notes/page_000022_US.html

hl是用C编写的Linux命令,专门用于为文本文件或命令的输出着色。您最多可以同时使用42种颜色,并使用配置文件来简化命令行。您可以为可以传递给另一命令的每条命令的输出着色。而且,如果您知道什么是正则表达式,那么使用起来将非常容易。您可以使用该man页面来了解如何使用它。
hl非常易于使用和配置。您甚至可以使用hl_generic脚本为命令输出着色,而无需修改其语法。
例如,您可以diff通过键入常规命令为命令的输出着色:

diff file1 file2

如果您需要帮助,请给我发送电子邮件。
问候。


1

目前在Github上使用python构建了一个非常好的工具,名为icdiff。产生漂亮的彩色输出,这些输出也具有“严重性”意识。我一直在使用它,非常值得一试。


1

如果您已安装vim,则可以执行 diff file1 file2 | vim -

Vim会识别diff格式并给它正确着色。最后的破折号是让vim接受来自diff命令的输入。


'view'(vim的只读快捷方式)更适合于此目的。
Anupam Srivastava,

1

安装通用增色剂(grc)并:

grc diff file1 file2

在Linux和MacOS上均可用。


0

您可以使用

1。diff --color=auto file1 file2

2。colordiff file1 file2

3.我的最爱:git diff file1 file2实施如下:

我当前使用并推荐使用,或者使用git diff 通过以下方式传递其输出colordiff

diff() { git diff --no-index "$1" "$2" | colordiff; }


我也喜欢,git diff --no-index但我认为文件必须易于查找。(至少,不适用于我的bash流程替代方法)
Karl

@Karl自己弄清楚,也许有一个终端设置可以做到这一点(或以其他方式使它易于查找)。我已经使用git diff了很长时间了,文件对我来说是可以找到的,否则我不会做对了。
himanshuxd

2
也许我不太清楚。作为一个(愚蠢的)示例,这对我有效,diff --color <(ls | head -n+3) <(ls | tail -n +5)但不适用于git diff。诚然,这不是一个普通的案例,也很难解决。
卡尔

0

只需注意:要获得“并排”输出,您需要“ --color = always”。您也可以用较少的分页码并保留彩色输出:

diff -y --color=always file1 file2 | less -R

还有另一个提示:尝试将“ --color = always”开关保持在末尾。原因?使用util-linux 2.27.1中的dmesg:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

该脚本使用标准的3.4版之前的diff(它可以与diff的任何版本一起使用),并且在不以任何方式更改输出格式的情况下为输出着色。它可与RHEL(7.5版)的最新版本一起使用,该版本具有GNU diff 3.3版。只需将其放在您的〜/ bin目录或路径中的其他任何位置(我建议将其称为“ cdiff”)。

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

0

字符级颜色差异:安装ccdiff

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

ccdiff的输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.