我正在尝试定义一个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
}
但是,这不起作用。请指教。
答案 0 :(得分:0)
答案 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|$)"; }