我想有条件地格式化Unix文件,我目前正在处理diff
命令,并且想知道是否可以格式化文本文件。diff
命令输出。
例:
匹配的值应显示为绿色。
不匹配的值应显示为红色。
假设我有两个文件file1
,file2
并且我的命令是diff file1 file2
。
现在我想假设输出包含5个不匹配项,那么这些不匹配项应以红色显示。如何使用unix实现?
简而言之,“对于不匹配的值,将diff命令的输出颜色更改为红色”
我想有条件地格式化Unix文件,我目前正在处理diff
命令,并且想知道是否可以格式化文本文件。diff
命令输出。
例:
匹配的值应显示为绿色。
不匹配的值应显示为红色。
假设我有两个文件file1
,file2
并且我的命令是diff file1 file2
。
现在我想假设输出包含5个不匹配项,那么这些不匹配项应以红色显示。如何使用unix实现?
简而言之,“对于不匹配的值,将diff命令的输出颜色更改为红色”
Answers:
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月)中添加。
alias diff='diff --color=auto'
如果可以访问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'
。
diff
。
尝试 colordiff file1 file2
Linux / BSD发行版中colordiff的可用性
那些运行Debian或Ubuntu(或它们的任何派生产品)的人可能只需要使用“ apt-get install colordiff”来下载和安装即可。colordiff还打包用于许多其他Linux,UNIX和BSD发行版和操作系统。
diff --color=auto
只有彩色标记和每个+
/ -
部分的第一行。通过管道less -SR
可以轻松浏览。
彩色字级 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
高亮)
您应该看看hl
github 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
如果您需要帮助,请给我发送电子邮件。
问候。
如果您已安装vim,则可以执行 diff file1 file2 | vim -
Vim会识别diff格式并给它正确着色。最后的破折号是让vim接受来自diff命令的输入。
您可以使用
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流程替代方法)
git diff
了很长时间了,文件对我来说是可以找到的,否则我不会做对了。
diff --color <(ls | head -n+3) <(ls | tail -n +5)
但不适用于git diff
。诚然,这不是一个普通的案例,也很难解决。
该脚本使用标准的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/"