使用时,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|^'哪个匹配所有行开头但只为所需文本着色.
这是我用来着色输出的脚本.
我想我在某种博客或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)
)
也许你可以做类似的事情?
编辑:抱歉,这不适用于正则表达式。你将不得不稍微调整它......
| 归档时间: |
|
| 查看次数: |
4525 次 |
| 最近记录: |