Grep nie jako wyrażenie regularne


97

Muszę wyszukać zmienną PHP $someVar. Jednak Grep myśli, że próbuję uruchomić wyrażenie regularne i narzeka:

$ 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">>

Nie widzę opcji mówienia grepowi, aby nie interpretował ciągu jako wyrażenia regularnego, ale aby zawierał $tylko inny znak ciągu.


4
W tym pytaniu głównym problemem nie jest grepinterpretacja $jako wyrażenia regularnego. Chodzi o podstawienie przez powłokę $someVarwartości zmiennej środowiskowej someVar, prawdopodobnie pustego ciągu. Drugi przykład nie powinien zwracać wszystkich wierszy, someVarale wszystkie wiersze, ponieważ pusty ciąg znajduje się we wszystkich wierszach. Aby powiedzieć powłoce, aby nie zastępowała, musisz użyć '$someVar'lub \$someVar. Wtedy będziesz musiał zająć się grepinterpretacją $postaci.
Christophe Drevet-Droguet,

1
@ ChristopheDrevet-Droguet: Dziękuję za wyjaśnienie, byłem zdziwiony, co do głosu przeciw! Twój komentarz jest wystarczająco pouczający, aby być odpowiedzią, w rzeczywistości byłaby to jedna z lepszych odpowiedzi na stronie, jeśli tak.
dotancohen

Odpowiedzi:



303

Użyj fgrep(przestarzałe) grep -Flub grep --fixed-strings, aby traktować wzorzec jako listę ustalonych ciągów zamiast wyrażenia regularnego.

W celach informacyjnych dokumentacja wspomina (fragmenty):

-F --fixed-stringsZinterpretuj wzorzec jako listę ustalonych ciągów (zamiast wyrażeń regularnych) oddzielonych znakami nowej linii, z których każdy ma zostać dopasowany. (-F jest określone przez POSIX.)

fgrepjest taki sam jak grep -F. Bezpośrednie wywołanie jako fgrep jest przestarzałe, ale jest dostarczane, aby umożliwić historycznym aplikacjom, które na nich polegały, działanie bez modyfikacji.

Pełne informacje można znaleźć na stronie : https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


prosta, świetna odpowiedź.
breadmj

Zgoda - kiedy używasz zmiennych, nie możesz zrobić z tym czegoś takiego jak PHP addslashes()w bashu. To najprostszy sposób na zrobienie tego.
geerlingguy

1
Dziękuję, zadziałało. Przypomnienie: jeśli używasz cudzysłowów, nadal będziesz musiał uciec od$ , np grep -FR "unset(\$foo['bar'])"
:, w

59

grep -Fjest standardowym sposobem grepinterpretowania argumentu jako ustalonego łańcucha, a nie wzorca.


1
Poważnie, to powinna być zaakceptowana odpowiedź!
ankush981

Niezła odpowiedź. Rozwiązał mój problem, gdy wyszukuję ciąg za pomocą $ za pomocą polecenia ssh. Ucieczka z "\" nie działała w tym scenariuszu. Ale flaga -F załatwiła sprawę.
Rajasekhar

8

Musisz powiedzieć grepowi, że używasz stałego ciągu zamiast wzorca, używając '-F':

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

3

W tym pytaniu głównym problemem nie jest grepinterpretacja $jako wyrażenia regularnego. Chodzi o podstawienie powłoki $someVarprzez wartość zmiennej środowiskowejsomeVar , prawdopodobnie pustego ciągu.

Więc w pierwszym przykładzie jest to jak wywołanie grepbez żadnego argumentu i dlatego daje usagewynik. Drugi przykład nie powinien zwracać wszystkich wierszy zawierających someVaroprócz wszystkich wierszy, ponieważ pusty ciąg znajduje się we wszystkich wierszach.

Aby powiedzieć powłoce, aby nie zastępowała, musisz użyć '$someVar'lub \$someVar. Wtedy będziesz musiał poradzić sobie z interpretacją grepa $postaci, stąd grep -Fopcja podana w wielu innych odpowiedziach.

Tak więc jedną prawidłową odpowiedzią byłoby:

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

2

+1 dla -Fopcji, będzie to zaakceptowana odpowiedź. Ponadto miałem „dziwne” zachowanie podczas wyszukiwania -I..wzorca w moich plikach, ponieważ -Iuznano, że opcja grep; aby uniknąć tego rodzaju błędów, możemy jawnie określić koniec argumentów polecenia za pomocą --.

Przykład:

grep -HnrF -- <pattern> <files>

Mam nadzieję, że to komuś pomoże.


co oznacza F?
Arnold Roa

Z gnu.org/software/grep/manual/grep.html : „-F: interpretuje wzorzec jako listę ustalonych ciągów (zamiast wyrażeń regularnych), oddzielonych znakami nowej linii, z których każdy ma zostać dopasowany. (-F jest określony przez POSIX.) "
Aloïké Go

Jeśli --jest używany, czy można -HnrFgo pominąć?
Daniel,

@Daniel Zależy to od tego, co chcesz zrobić: -Funika interpretowania wzorca jako wyrażenia regularnego, podczas gdy --unika interpretowania następujących po nim elementów jako opcji grep.
Aloïké Go

@ AloïkéGo Dzięki, rozumiem.
Daniel,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.