Цитаты при использовании 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
Ответы
Ответ 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 для шаблона).