Шаблон регулярного выражения grep вызывает непредвиденное поведение команды

Я ищу строки с $ и последовательно ' или же " через этот grep в моем терминале:

grep "\\$('|\")" -rin folder_path

После нажатия кнопки ввода терминал не считает, что строка завершена, поэтому он добавляет еще одну строку для меня, чтобы продолжать писать. Если я нажимаю Tab во время записи folder_path это показывает эту ошибку:

bash: command substitution: line 107: syntax error: file premature end
bash: command substitution: line 106: unexpected file premature end while searching for `''

Эти сообщения об ошибках были переведены, потому что часть из них показана на португальском языке. Я использую Ubuntu 13.10.

Что случилось?

2 ответа

Решение

Использовать этот:

grep -rn "\$\('\|\"\)" /path/to/directory

Ваша проблема на самом деле двоякая:

  • От grepс точки зрения, вы используете расширенные регулярные выражения, т.е. (, |, ) не избегая их (чтобы относиться к ним особенным) внутри вашего шаблона базовых регулярных выражений. Чтобы преодолеть это, либо избегите всех тех, кто относится к ним особенным, либо -E вариант grep,

  • Другая проблема, вызванная вышеупомянутой проблемой, заключается в том, что $() это bash шаблон подстановки команд, поскольку вы не избежали соответствующих символов bash лечил шаблон $() в качестве замены команды. Обратите внимание, что \\$() на самом деле делает команду \ подстановка команды плюс как первая \ сделаю второй \ литерал и оставшийся шаблон подстановки команд останутся без изменений.

Также обратите внимание, что -i здесь нет необходимости, так как мы не ищем буквенные символы. Возможно, вас заинтересует печать имен файлов:

grep -Hrn "\$\('\|\"\)" /path/to/directory

Другое дело, что ты можешь сбежать, не сбежав $ (указывает на конец строки) в этом случае, потому что есть символы для сопоставления после $, в следствии grep будем относиться к этому буквально

grep -Hrn "$\('\|\"\)" /path/to/directory

Понятия не имею, что вы делаете неправильно, так как я не так хорош с grep, но вы должны делать это grep "\$'\|\$\"", в основном ищите $'или $", и обратите внимание, что все эти выражения экранированы

Вот пример:

введите описание здесь

Другие вопросы по тегам