Grep не как регулярное выражение


96

Мне нужно найти переменную PHP $someVar. Однако Grep думает, что я пытаюсь запустить регулярное выражение, и жалуется:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

Я не вижу возможности указать grep не интерпретировать строку как регулярное выражение, а включить $как просто еще один строковый символ.


3
В этом вопросе основная проблема заключается не в grepинтерпретации $как регулярного выражения. Речь идет о замене оболочки $someVarзначением переменной среды someVar, вероятно, пустой строкой. Второй пример должен возвращать не все строки, someVarа все строки, потому что пустая строка находится во всех строках. Чтобы оболочка не заменяла замену, вы должны использовать '$someVar'или \$someVar. Тогда вам придется заняться grepинтерпретацией $персонажа.
Christophe Drevet-Droguet

1
@ ChristopheDrevet-Droguet: Спасибо за объяснение, я был озадачен отрицательным голосом! Ваш комментарий достаточно информативен, чтобы быть ответом, на самом деле, это был бы один из лучших ответов на странице, если так.
dotancohen

Ответы:



299

Используйте fgrep(не рекомендуется) grep -Fили grep --fixed-strings, чтобы он обрабатывал шаблон как список фиксированных строк вместо регулярного выражения.

Для справки в документации упоминаются (выдержки):

-F --fixed-stringsИнтерпретируйте шаблон как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любая из которых должна быть сопоставлена. (-F определяется POSIX.)

fgrepтакое же, как grep -F. Прямой вызов как fgrep устарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.

Для полной справки проверьте: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


простой отличный ответ.
Breadmj

Согласен - когда вы используете переменные, вы не можете делать с ними что-то вроде PHP addslashes()в bash. Это самый простой способ сделать это.
geerlingguy

1
Спасибо, это сработало. Напоминание: при использовании двойных кавычек вам все равно придется избегать$ , например:, в grep -FR "unset(\$foo['bar'])"противном случае он думает, что это внешняя переменная, и пытается ее расширить
aexl

57

grep -F- это стандартный способ grepинтерпретировать аргумент как фиксированную строку, а не шаблон.


1
Серьезно, это должен был быть принятый ответ!
ankush981

Хороший ответ. Это решило мою проблему, когда я ищу строку с помощью $ с помощью команды ssh. В этом сценарии экранирование с помощью "\" не сработало. Но флаг -F сделал свое дело.
Rajasekhar

8

Вы должны указать grep, что вы используете фиксированную строку вместо шаблона, используя '-F':

grep -ir "Something Here" * | grep -F \$somevar

3

В этом вопросе основная проблема заключается не в grepинтерпретации $как регулярного выражения. Речь идет о замене оболочки $someVarзначением переменной среды someVar, вероятно, пустой строкой.

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

Чтобы оболочка не заменяла замену, вы должны использовать '$someVar'или \$someVar. Затем вам придется иметь дело с интерпретацией $символа grep , поэтому grep -Fвариант, указанный во многих других ответах.

Итак, один верный ответ:

grep -ir "Something Here" * | grep '$someVar'

2

+1 за -Fвариант, это будет принятый ответ. Кроме того, у меня было «странное» поведение при поиске -I..шаблона в моих файлах, так как -Iон рассматривался как вариант grep; чтобы избежать подобных ошибок, мы можем явно указать конец аргументов команды, используя --.

Пример:

grep -HnrF -- <pattern> <files>

Надеюсь, это кому-то поможет.


что означает F?
Арнольд Роа,

Из gnu.org/software/grep/manual/grep.html : "-F: интерпретировать шаблон как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любая из которых должна быть сопоставлена. (-F указано в POSIX.) "
Aloïké Go

Если --используется, можно -HnrFне указывать?
Daniel

@Daniel Это зависит от того, что вы хотите сделать: -Fизбегает интерпретации шаблона как регулярного выражения, в то время как --избегает интерпретации элементов, следующих за ним, как параметров grep.
Aloïké Go

@ AloïkéGo Спасибо, я понял.
Daniel
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.