Цитаты при использовании grep? - PullRequest
17 голосов
/ 09 июня 2010

Grep действует по-разному в зависимости от того, какими цитатами я окружаю регулярное выражение. Я не могу понять, почему это так. Вот пример проблемы:

hamiltont$ grep -e show\(  test.txt 
  variable.show();
  variable.show(a);
  variable.show(abc, 132);
  variableshow();
hamiltont$ grep -e "show\("  test.txt 
grep: Unmatched ( or \(
hamiltont$ grep -e 'show\('  test.txt 
grep: Unmatched ( or \(

Я просто предполагаю, что есть какой-то правильный способ заключить регулярное выражение в одинарные / двойные кавычки. Любая помощь?

FWIW, grep --version возвращает grep (GNU grep) 2.5.1

Ответы [ 4 ]

25 голосов
/ 09 июня 2010

Командная строка, включающая аргументы, обрабатывается оболочкой до ее выполнения.Вы можете использовать echo , чтобы увидеть, что делает оболочка:

$ echo grep -e show\(  test.txt 
grep -e show( test.txt

$ echo grep -e "show\("  test.txt 
grep -e show\( test.txt

$ echo grep -e 'show\('  test.txt 
grep -e show\( test.txt

Таким образом, без кавычек удаляется обратная косая черта, что делает "(" нормальным символом для grep (grep использует basic regex по умолчанию, используйте -E, чтобы grep использовал extended regex).

3 голосов
/ 09 июня 2010

В заказе:

grep -e show( test.txt

не работает, потому что оболочка интерпретирует ( как специальный, круглую скобку, а не просто символ, и не может найти закрывающий ).

Они оба работают:

grep -e 'show(' test.txt
grep -e "show(" test.txt

потому что оболочка обрабатывает цитируемый текст как просто текст и передает его grep.

Это не работает:

grep -e 'show\(' test.txt
grep -e "show\(" test.txt

поскольку оболочка передает show\( в grep, grep видит \( в качестве особого, круглую скобку, а не просто символ, и не может найти закрывающий \).

2 голосов
/ 09 июня 2010

Кавычки меняют то, что видит grep. Обратная косая черта (\) в форме без кавычек обрабатывается оболочкой, которая обрабатывает символы после обратной косой черты как специальные. Это происходит до того, как grep получит параметр. grep видит show (. Когда используются кавычки (одинарные или двойные), оболочка интерпретирует их как «оставьте содержимое в покое», поэтому grep видит show \ ( и * \ ( символы имеют значение в grep, и он ищет закрывающую скобку - \).

Кстати: обработка одинарных и двойных кавычек отличается тем, как оболочка обрабатывает переменные оболочки, но в вашем примере нет переменных оболочки.

0 голосов
/ 09 июня 2010

Я не верю, что grep ведет себя по-другому, это оболочка.Я предполагаю, что вы используете bash

http://www.faqs.org/docs/bashman/bashref_8.html

В основном, цитируемые версии ведут себя по-разному в слэше, в зависимости от механизма цитирования.

Оба из цитируемыхпримеры работали бы без слеша.Во-первых, оболочка избежит (и передаст только шоу) в grep для шаблона.

...