2015-06-01 3 views
0

Я пытаюсь определить функцию bash, highlight, которую я могу использовать, чтобы выделить условия поиска на выходе предыдущей команды. Когда я делаю это с терминала, он отлично работает следующим образом:Вывод трубы на функцию egrep

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

Да, catting упрощенный пример, но он показывает, как я могу сделать это из командной строки. Я хотел бы использовать это в общем как: cat foo | hightlight bar

Из того, что я прочитал, я не могу просто результаты трубных к egrep, как я надеялся, так что я наивно попытался определением моей функции Баша как:

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

Однако это не работает. Пожалуйста, порекомендуйте.

+0

Обратите внимание, что это будет * исключение * любая линия, * не * содержать шаблон. Это то, что вы хотите? –

ответ

0

Ваше цитирование просто совершенно неверно.

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

включить апострофы в шаблоне, и вы на самом деле не со ссылкой на параметр функции.

echo \"$line\" | egrep $pat 

Вы включаете буквальные двойные кавычки в выражении эха и не указываете обе переменные.

Это лучше:

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 обозначает extended grep, потому что он использует расширенный синтаксис регулярных выражений POSIX. Он ведет себя как стандартный grep -E

Читать man page:

является задать расширенное же, как 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 
Смежные вопросы