Кавычки при использовании grep?

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

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 \(

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

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

17
задан Hamy 9 June 2010 в 17:52
поделиться

4 ответа

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

25
ответ дан 30 November 2019 в 12:27
поделиться

По порядку:

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 видит \ ( как специальный, круглую скобку, а не просто символ, и может Не удалось найти закрывающую \) .

4
ответ дан 30 November 2019 в 12:27
поделиться

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

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

В основном цитируемые версии по-разному работают с косой чертой, в зависимости от механизма цитирования.

Оба приведенных примера работали бы без косой черты. В первом случае оболочка экранирует (и передает только show (grep для шаблона.

)
0
ответ дан 30 November 2019 в 12:27
поделиться

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

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

2
ответ дан 30 November 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: