Grep non come espressione regolare


96

Devo cercare una variabile PHP $someVar. Tuttavia, Grep pensa che sto cercando di eseguire una regex e si lamenta:

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

Non vedo un'opzione per dire a grep di non interpretare la stringa come una regex, ma di includere $solo un altro carattere stringa.


3
In questa domanda, il problema principale non riguarda l' grepinterpretazione $come regex. Si tratta della sostituzione della shell $someVarcon il valore della variabile d'ambiente someVar, probabilmente la stringa vuota. Il secondo esempio non dovrebbe restituire tutte le righe con someVarma tutte le righe, perché la stringa vuota è in tutte le righe. Per dire alla shell di non sostituire, devi usare '$someVar'o \$someVar. Poi dovrai affrontare l' grepinterpretazione del $personaggio.
Christophe Drevet-Droguet

1
@ ChristopheDrevet-Droguet: Grazie per la spiegazione, ero perplesso per il voto negativo! Il tuo commento è abbastanza informativo per essere una risposta, infatti sarebbe una delle migliori risposte sulla pagina se così fosse.
dotancohen

Risposte:



299

Usa fgrep(deprecato), grep -Fo grep --fixed-strings, per fare in modo che tratti il ​​pattern come un elenco di stringhe fisse, invece di un'espressione regolare.

Per riferimento, la documentazione menziona (estratti):

-F --fixed-stringsInterpreta il modello come un elenco di stringhe fisse (invece di espressioni regolari), separate da nuove righe, ognuna delle quali deve essere trovata. (-F è specificato da POSIX.)

fgrepè lo stesso di grep -F. Il richiamo diretto come fgrep è deprecato, ma viene fornito per consentire alle applicazioni cronologiche che si basano su di essi di funzionare senza modifiche.

Per il riferimento completo, controlla: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html


semplice ottima risposta.
breadmj

D'accordo: quando usi le variabili non puoi fare qualcosa come PHP addslashes()in bash. Questo è il modo più semplice per farlo.
geerlingguy

1
Grazie, ha funzionato. Promemoria: se si utilizzano le virgolette doppie, sarà comunque necessario eseguire l' escape$ , ad esempio grep -FR "unset(\$foo['bar'])"
:,

57

grep -Fè un modo standard per dire grepdi interpretare l'argomento come una stringa fissa, non come uno schema.


1
Seriamente, questa avrebbe dovuto essere la risposta accettata!
ankush981

Bella risposta. Ha risolto il mio problema quando cerco una stringa con $ usando il comando ssh. L'escape con "\" non ha funzionato in quello scenario. Ma la bandiera -F ha funzionato.
Rajasekhar

8

Devi dire a grep che usi una stringa fissa, invece di un pattern, usando '-F':

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

3

In questa domanda, il problema principale non riguarda l' grepinterpretazione $come regex. Si tratta della sostituzione della shell $someVarcon il valore della variabile d'ambiente someVar, probabilmente la stringa vuota.

Quindi nel primo esempio, è come chiamare grepsenza alcun argomento, ed è per questo che ti dà un usageoutput. Il secondo esempio non dovrebbe restituire tutte le righe che contengono someVarma tutte le righe, perché la stringa vuota è in tutte le righe.

Per dire alla shell di non sostituire, devi usare '$someVar'o \$someVar. Quindi dovrai affrontare l'interpretazione grep del $personaggio, da qui l' grep -Fopzione data in molte altre risposte.

Quindi una risposta valida sarebbe:

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

2

+1 per l' -Fopzione, sarà la risposta accettata. Inoltre, ho avuto un comportamento "strano" durante la ricerca del -I..pattern nei miei file, poiché -Iera considerato un'opzione di grep; per evitare questo tipo di errori, possiamo specificare esplicitamente la fine degli argomenti del comando usando --.

Esempio:

grep -HnrF -- <pattern> <files>

Spero che possa aiutare qualcuno.


cosa sta per F?
Arnold Roa

Da gnu.org/software/grep/manual/grep.html : "-F: interpreta il pattern come un elenco di stringhe fisse (invece di espressioni regolari), separate da newline, ognuna delle quali deve essere trovata. (-F è specificato da POSIX.) "
Aloïké Go

Se --viene utilizzato, può -HnrFessere omesso?
Daniel

@Daniel Dipende da cosa vuoi fare: -Fevita di interpretare il pattern come un'espressione regolare, mentre --evita di interpretare gli elementi che lo seguono come opzioni di grep.
Aloïké Go

@ AloïkéGo Grazie, ho capito.
Daniel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.