管道输出到egrep功能

时间:2015-06-01 22:46:32

标签: bash grep

我正在尝试定义一个bash函数highlight,我可以用它来突出显示上一个命令输出中的搜索项。当我从终端执行此操作时,它可以正常工作如下:

# highlight all occurrences of bar in file foo
cat foo | egrep '(bar|$)'

是的,catting是一个简化的例子,但它演示了如何从命令行执行此操作。我想将它一般用作:cat foo | hightlight bar

从我读过的内容来看,我不能像我希望的那样简单地将结果传递给egrep,所以我天真地尝试将我的bash函数定义为:

highlight() {
  while read line; do
    pat="'("$1"|$)'"
    echo \"$line\" | egrep $pat
  done
}

但是,这不起作用。请指教。

3 个答案:

答案 0 :(得分:0)

我不确定你读了什么,但这是错的。 egrep代表扩展grep ,因为它使用扩展的POSIX正则表达式语法。它的行为类似于标准grep -E

阅读man page

  

egrep与grep -E

相同

答案 1 :(得分:0)

在我看来你应该改变这个

pat="'("$1"|$)'"

pat="($1|\$)"

另外,我认为不需要“$”。另外,我认为最好将“pat”的初始化移出循环。这是我得到的(测试):

#!/bin/bash

function highlight {
    pattern="$1"

    while read line; do
        echo "$line" | egrep --color "$pattern"
    done
}


echo -e 'a\nb\nbar\nhibar' | highlight bar

答案 2 :(得分:0)

你的报价完全错了。

pat="'("$1"|$)'"

你在模式中包含文字单引号,而你实际上引用了函数参数。

echo \"$line\" | egrep $pat

你在echo语句中包含文字双引号,并且没有引用这两个变量。

这样更好:

highlight() {
  while read -r line; do
    pat="($1|$)"
    echo "$line" | grep -E "$pat"
  done
}

但是,grep知道如何从stdin读取,所以简化:

highlight() { grep -E "($1|$)"; }