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
Командная строка, включая аргументы, обрабатывается оболочкой перед ее выполнением. Вы можете использовать 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 использовал расширенное регулярное выражение).
По порядку:
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 видит \ (
как специальный, круглую скобку, а не просто символ, и может Не удалось найти закрывающую \)
.
Я не верю, что это grep ведет себя иначе, это оболочка. Я предполагаю, что вы используете bash
http://www.faqs.org/docs/bashman/bashref_8.html
В основном цитируемые версии по-разному работают с косой чертой, в зависимости от механизма цитирования.
Оба приведенных примера работали бы без косой черты. В первом случае оболочка экранирует (и передает только show (grep для шаблона.
)Кавычки меняют то, что видит grep. Обратная косая черта (\) в форме без кавычек обрабатывается оболочкой, которая обрабатывает символы после обратной косой черты как особые. Это происходит до того, как grep получит параметр. grep видит show (. Когда используются кавычки (одинарные или двойные), оболочка интерпретирует их как «оставить содержимое в покое», таким образом grep видит show \ ( и ] \ ( символы имеют значение в grep, и он ищет закрывающую скобку - \).
BTW: Обработка одинарных и двойных кавычек отличается тем, как оболочка обрабатывает переменные оболочки, но в ваш пример.