2015-06-01 55 views
0

我想定義一個bash函數highlight,我可以用它來突出顯示前一個命令的輸出中的搜索項。當我做到這一點從終端,它的工作原理罰款如下:管輸出egrep函數

# 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

你引用是完全錯誤的。

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

您在模式中包含文字單引號,而你居然不引用功能參數。

echo \"$line\" | egrep $pat 

您在echo語句中包含了文字雙引號,並且未能引用這兩個變量。

這是更好的:

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

然而,grep的知道如何從標準輸入讀取,所以簡化:

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

因此'highlight(){grep -E「($ 1 | $)」; }'看起來似乎有效,但我爲什麼'highlight(){egrep'($ 1 | $)''令人困惑。 ''不。 – fmpdmb

+0

當您使用單引號時,您正在防止擴展'$ 1'變量。 –

0

我不確定你讀了什麼,但它是錯誤的。 egrep代表擴展grep,因爲它使用擴展的POSIX正則表達式語法。它的行爲像標準grep -E

閱讀man page

egrep的是相同作爲grep的-E

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