颜色正则expression式匹配 – 不会丢失未命中

当使用grep --color=always我可以得到漂亮的颜色突出显示正则expression式匹配。

但是, grep只返回至less有一个匹配的行。 相反,我正在寻找一种简单地突出显示正则expression式匹配的方法,同时保留所有其他input,而不会丢失任何匹配的行。

我试图让颜色与sed工作,阅读grep文档,但我似乎无法得到我想要的。

如果我的描述不是很明显,我想:

INPUT:

  • 弗雷德
  • 摊晒

正则expression式:

  • “。*红”

OUTPUT:

  • 弗雷德(红色)
  • 摊晒
  • 红色(红色)

所以我可以这样做:

 list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest" 

编辑:

我find了一个解决scheme,这不是很好,但它的工作原理:

感谢: http : //www.pixelbeat.org/docs/terminal_colours/

特别是脚本(我修改/简化): http : //www.pixelbeat.org/talks/iitui/sedgrep

 function sedgrep () { C_PATT=`echo -e '\033[33;01m'` C_NORM=`echo -e '\033[m'` sed -s "s/$1/${C_PATT}&${C_NORM}/gi" } 

仍然在寻找一个更简单的方法来做到这一点!

Solutions Collecting From Web of "颜色正则expression式匹配 – 不会丢失未命中"

最简单的解决方法是使用egrep --color=always 'text|^' ,它可以匹配所有的行开始,但只是给所需的文本着色。

这是一个我用来着色输出的脚本。

我想我在某种博客或者bash / sed教程中找到了这个想法/片段 – 现在已经很久以前找不到它了。

 #!/bin/bash red=$(tput bold;tput setaf 1) green=$(tput setaf 2) yellow=$(tput bold;tput setaf 3) fawn=$(tput setaf 3) blue=$(tput bold;tput setaf 4) purple=$(tput setaf 5) pink=$(tput bold;tput setaf 5) cyan=$(tput bold;tput setaf 6) gray=$(tput setaf 7) white=$(tput bold;tput setaf 7) normal=$(tput sgr0) sep=`echo -e '\001'` # use \001 as a separator instead of '/' while [ -n "$1" ] ; do color=${!1} pattern="$2" shift 2 rules="$rules;s$sep\($pattern\)$sep$color\1$normal${sep}g" done #stdbuf -o0 -i0 sed -u -e "$rules" sed -u -e "$rules" 

用法:

 ./colorize.sh color1 pattern1 color2 pattern2 ... 

例如

 dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \ green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*' 

对重叠模式不适用,但我发现它非常有用。

HTH

这个小函数在我的ZShell中运行良好:

 function color_grep { sed s/$1/$fg[yellow]$1$terminfo[sgr0]/g } 

(需要

 autoload colors zsh/terminfo 

也许你可以做类似的事情?

编辑:对不起,这不适用于正则表达式。 你将不得不稍微调整一下…

您可以使用-C<num>选项来grep其中显示您匹配的上下文的行数。 只要确保<num>至少与文件中的行数一样大。

你现在这样做的方式大概就像你期望的那样干净,除非你自己写grep工具。 如果你不一定关心保存输出的顺序,那么我可以用另一种方式来做这件事:

 function colormatch () { tee - | grep --color=always $1 | sort | uniq } 

不如使用sed(创建更多的进程,并开始输出)效率,所以我可能会建议坚持你的sed解决方案。

我最近做了一个类似的过滤器。 我用它来为多个文件尾部的“标题”着色,如下所示:

tail -f access.log error.log foo.log | logcol.sh

标题看起来像这样:

==> access.log <==

我对不同的日志文件之间的快速变化感到困惑,所以这个logcol.sh有帮助。 ==>是针对特定用途硬编码的,但也可以是一个参数。

 #!/bin/sh while read line do if test `expr "$line" : "==>.*"` -eq 0 ; then printf '\033[0m%s\n' "$line" else printf '\033[0;31m%s\n' "$line" fi done 

也许不是最优雅的,但我认为它很可读。 我希望我没有任何错别字;-) HTH,抢

我正在挖这个小python实用程序。 如果不在debian上,请使用alien转换为rpm。

http://korpus.juls.savba.sk/~garabik/software/grc.html

 regexp=.*red colours="\033[38;5;160m" count=once 

这是一个很好的终端颜色页面。

http://www.pixelbeat.org/docs/terminal_colours/

(女王的英语如此多彩)