Греп не як регулярний вираз


96

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


3
У цьому питанні головне питання полягає не в grepінтерпретації $як регулярний вираз. Мова йде про підстановку оболонки $someVarзначенням змінної середовища someVar, ймовірно, порожнім рядком. Другий приклад не повинен повертати всі рядки, someVarале всі рядки, оскільки порожній рядок є у всіх рядках. Щоб сказати, щоб оболонка не підміняла, ви повинні використовувати '$someVar'або \$someVar. Тоді вам доведеться зайнятися grepінтерпретацією $персонажа.
Крістоф Древет-Дроге

1
@ ChristopheDrevet-Droguet: Дякую за пояснення, я був спантеличений щодо голосування проти! Ваш коментар є достатньо інформативним, щоб відповісти, насправді це був би один з кращих відповідей на сторінці, якщо так.
дотанкохен

Відповіді:



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 зробив свою справу.
Раджасехар,

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 Це залежить від того, що ви хочете зробити: -Fуникає інтерпретації шаблону як регулярного виразу, тоді як --уникає інтерпретації елементів, що слідують за ним, як опцій grep.
Aloïké Go

@ AloïkéGo Дякую, розумію.
Даніель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.