2012-02-23 4 views
52

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

+0

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

+1

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

ответ

7

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

+4

Или, '... | grep '$ someVar'' –

188

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

+17

Это должен быть принятый ответ. –

+0

простой большой ответ. – breadmj

+0

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

43

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

+1

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

+0

Хороший ответ. Он решил мою проблему при поиске строки с помощью $ с помощью команды ssh. Сценарий «\» не работал в этом сценарии. Но флаг ФФ сделал трюк. – Rajasekhar

7

Вы должны сказать Grep использовании фиксированной строки, вместо шаблона, используя «-F»:

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

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

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

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

Так один действительный ответ был бы:

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

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

Пример:

grep -HnrF -- <pattern> <files> 

Надежда это поможет кому-то.

+0

Что означает F? –

+0

С http://www.gnu.org/software/grep/manual/grep.html: "-F: интерпретировать шаблон как список фиксированных строк (вместо регулярных выражений), разделенных символами новой строки, любой из которых (-F указывается POSIX.) « –

+0

Если используется' --', можно ли «-HnrF» пропустить? – Daniel

Смежные вопросы