Подтвердить что ты не робот

Цитаты при использовании grep?

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

4b9b3361

Ответ 1

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

$ 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 использовал расширенное регулярное выражение).

Ответ 2

В порядке:

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

Ответ 3

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

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

Ответ 4

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

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

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

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