Шаблон регулярного выражения 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 "\$'\|\$\""
, в основном ищите $'или $", и обратите внимание, что все эти выражения экранированы
Вот пример: