我在 ~/.bash_profile 中编写了以下过滤器作为函数:
hilite() {
export REGEX_SED=$(echo $1 | sed "s/[|()]/\\\&/g")
while read line
do
echo $line | egrep "$1" | sed "s/$REGEX_SED/\x1b[7m&\x1b[0m/g"
done
exit 0
}
查找与正则表达式匹配的任何内容的行,并在与 VT100 兼容的终端上使用 ANSI 转义码突出显示匹配项。
例如,以下查找并突出显示字符串bin、U或1,它们是 /etc/passwd 的最后 10 行中的整个单词:
tail /etc/passwd | hilite "\b(bin|[U1])\b"
然而,脚本运行非常缓慢,因为每一行都分叉了一个 echo、egrep 和 sed。
在这种情况下,对整个输入执行 egrep 并在其输出上运行 sed 会更有效。
我怎样才能修改我的功能来做到这一点?如果可能,我宁愿不创建任何临时文件。
PS有没有另一种方法可以以类似的方式查找和突出显示线条?