代码之家  ›  专栏  ›  技术社区  ›  mmocny

颜色正则表达式匹配-不丢失

  •  19
  • mmocny  · 技术社区  · 16 年前

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

    然而, grep 只返回至少有一个匹配项的行。相反,我正在寻找一种方法来简单地突出显示regex匹配项,同时保留所有其他输入,而不删除没有任何匹配项的行。

    我试着让颜色和 sed ,并阅读 格雷普 文件,但我似乎得不到我想要的。

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

    输入:

    • 弗莱德
    • 特德
    • 红色
    • 领导

    正则表达式:

    • “*红色”

    输出:

    • 弗雷德(红色)
    • 特德
    • 红色(红色)
    • 领导

    所以我可以:

    list_stuff | color_grep "make_this_stand_out_but_dont_hide_the_rest"
    

    编辑:

    我找到了一个解决方案,虽然不是很好,但它确实有效:

    感谢: 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"
    }
    

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

    7 回复  |  直到 16 年前
        1
  •  20
  •   crenate    13 年前

    最简单的解决方案是 egrep --color=always 'text|^' 它将匹配所有行首,但只为所需文本上色。

        2
  •  7
  •   Pawel Wiejacha    12 年前

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

    我想我在某个博客或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.*'
    

    不能很好地处理重叠的模式,但是我发现它非常有用。

    高温高压

        3
  •  3
  •   boxxar    16 年前

    这个小函数在我的zshell中运行得很好:

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

    (需要

    autoload colors zsh/terminfo
    

    )

    也许你能做点类似的事?

    编辑:抱歉,这对regex不起作用。你得稍微调整一下…

        4
  •  1
  •   Jay    16 年前

    你现在做这件事的方式可能和你想做的一样干净,除非你当然写了你自己的grep工具。如果您不一定关心保持输出的顺序,我可以想到另一种方法:

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

    不如使用sed(创建更多进程,并发送输出)那么有效,所以我可能建议您坚持使用sed解决方案。

        5
  •  1
  •   PiedPiper    16 年前

    你可以用 -C<num> grep选项,它向您显示 <num> 你的比赛周围的背景线。只要确定 <数量> 至少与文件中的行数相同大。

        6
  •  0
  •   RobRob    16 年前

    我最近做了一个类似的过滤器。我用它给“头”涂上多个文件的颜色,如下所示:

    tail-f access.log error.log foo.log日志col.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公司, 抢劫

        7
  •  0
  •   TJR    15 年前

    我正在研究这个小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/

    (女王的英语真是多姿多彩。)