Grep не как регулярное выражение - PullRequest
70 голосов
/ 23 февраля 2012

Мне нужно найти переменную 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 не , что интерпретировать строку как регулярное выражение, но включить $ как еще один символ строки.

Ответы [ 6 ]

244 голосов
/ 23 февраля 2012

Используйте 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

52 голосов
/ 23 февраля 2012

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

8 голосов
/ 23 февраля 2012

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

grep -ir "Something Here" * | grep -F \$somevar
1 голос
/ 03 июня 2016

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

Пример:

grep -HnrF -- <pattern> <files>

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

1 голос
/ 25 марта 2016

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

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

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

Таким образом, один правильный ответ будет:

grep -ir "Something Here" * | grep '$someVar'
0 голосов
/ 23 февраля 2012

Побег $, поставив \ перед ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...