Ответ 1
Побегите $
, положив перед ним \
.
Мне нужно найти переменную PHP $someVar
. Однако Греп думает, что я пытаюсь запустить регулярное выражение и жалуюсь:
$ 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, чтобы не интерпретировать строку как регулярное выражение, а включить $
как только другой строковый символ.
Побегите $
, положив перед ним \
.
Используйте 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
grep -F
- это стандартный способ сказать grep
интерпретировать аргумент как фиксированную строку, а не шаблон.
Вы должны сказать grep, что вы используете фиксированную строку вместо шаблона, используя '-F':
grep -ir "Something Here" * | grep -F \$somevar
В этом вопросе основной проблемой является не grep
интерпретация $
как регулярное выражение. Это о оболочке, заменяющей $someVar
значением переменной окружения someVar
, вероятно, пустой строкой.
Итак, в первом примере это как вызов grep
без каких-либо аргументов, и поэтому он дает вам вывод usage
. Второй пример не должен возвращать все строки, содержащие someVar
, а все строки, потому что пустая строка находится во всех строках.
Чтобы заставить оболочку не подставлять, вы должны использовать '$someVar'
или \$someVar
. Затем вам придется иметь дело с интерпретацией grep символа $
, поэтому параметр grep -F
указан во многих других ответах.
Итак, один правильный ответ:
grep -ir "Something Here" * | grep '$someVar'
+1 для опции -F
, это должен быть принятый ответ.
Кроме того, у меня было "странное" поведение при поиске шаблона -I..
в моих файлах, поскольку -I
рассматривался как опция grep
; чтобы избежать таких ошибок, мы можем явно указать конец аргументов команды с помощью --
.
Пример:
grep -HnrF -- <pattern> <files>
Надеюсь, что это поможет кому-то.