颜色正则表达式匹配 - 没有丢失未命中

mmo*_*cny 19 regex linux

使用时,grep --color=always我可以为正则表达式匹配获得漂亮的颜色突出显示.

但是,grep只返回至少有一个匹配的行.相反,我正在寻找一种方法来简单地突出正则表达式匹配,同时保留所有其他输入,而不丢弃没有任何匹配的行.

我试图使用颜色sed,并阅读grep文档,但我似乎无法得到我想要的.

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

INPUT:

  • 弗雷德
  • 摊晒
  • 红色

正则表达式:

  • ".*红色"

OUTPUT:

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

所以我可以这样做:

list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest"
Run Code Online (Sandbox Code Playgroud)

编辑:

我找到了一个不太漂亮的解决方案,但它有效:

感谢: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"
}
Run Code Online (Sandbox Code Playgroud)

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

cre*_*ate 20

最简单的解决方案是使用egrep --color=always 'text|^'哪个匹配所有行开头但只为所需文本着色.

  • 这对我不起作用,但这样做:egrep --color = always'text | $'顺便说一句,我正在使用zsh. (3认同)

Paw*_*cha 8

这是我用来着色输出的脚本.

我想我在某种博客或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"
Run Code Online (Sandbox Code Playgroud)

用法:

./colorize.sh color1 pattern1 color2 pattern2 ...
Run Code Online (Sandbox Code Playgroud)

例如

dmesg | colorize.sh red '.*Hardware Error.*' red 'CPU[0-9]*: Core temperature above threshold' \
green 'wlan.: authenticated.*' yellow 'wlan.: deauthenticated.*'
Run Code Online (Sandbox Code Playgroud)

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

HTH


小智 3

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

function color_grep {
    sed s/$1/$fg[yellow]$1$terminfo[sgr0]/g
}
Run Code Online (Sandbox Code Playgroud)

(需要

autoload colors zsh/terminfo
Run Code Online (Sandbox Code Playgroud)

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

编辑:抱歉,这不适用于正则表达式。你将不得不稍微调整它......