Grep nicht als regulärer Ausdruck

95

Ich muss nach einer PHP-Variablen suchen $someVar. Grep glaubt jedoch, dass ich versuche, eine Regex auszuführen, und beschwere mich:

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

Ich sehe nicht , eine Option für das Erklären grep nicht die Zeichenfolge als regex zu interpretieren, aber die gehören $einfach als eine weitere Zeichenkette.

dotancohen
quelle
3
In dieser Frage geht es nicht um die grepInterpretation $als Regex. Es geht darum, dass die Shell $someVardurch den Wert der Umgebungsvariablen ersetzt wird someVar, wahrscheinlich durch die leere Zeichenfolge. Das zweite Beispiel sollte nicht alle Zeilen mit, someVarsondern alle Zeilen zurückgeben, da sich die leere Zeichenfolge in allen Zeilen befindet. Um die Shell anzuweisen, nicht zu ersetzen, müssen Sie '$someVar'oder verwenden \$someVar. Dann müssen Sie sich mit der grepInterpretation des $Charakters befassen .
Christophe Drevet-Droguet
1
@ ChristopheDrevet-Droguet: Danke für die Erklärung, ich war verwirrt über die Ablehnung! Ihr Kommentar ist informativ genug, um eine Antwort zu sein. In diesem Fall wäre er eine der besseren Antworten auf der Seite.
Dotancohen

Antworten:

-6

Entkomme dem, $indem \du ein davor stellst.

Herr Lister
quelle
294

Verwenden Sie fgrep(veraltet) grep -Foder grep --fixed-strings, um das Muster als Liste fester Zeichenfolgen anstelle eines regulären Ausdrucks zu behandeln.

Als Referenz erwähnt die Dokumentation (Auszüge):

-F --fixed-stringsInterpretieren Sie das Muster als eine Liste fester Zeichenfolgen (anstelle von regulären Ausdrücken), die durch Zeilenumbrüche getrennt sind, von denen jede übereinstimmen soll. (-F wird von POSIX angegeben.)

fgrepist das gleiche wie grep -F. Der direkte Aufruf als fgrep ist veraltet, wird jedoch bereitgestellt, damit historische Anwendungen, die auf ihnen basieren, unverändert ausgeführt werden können.

Die vollständige Referenz finden Sie unter: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

Hasturkun
quelle
einfach tolle Antwort.
Brot
Einverstanden - Wenn Sie Variablen verwenden, können addslashes()Sie in Bash keine PHPs ausführen. Dies ist der einfachste Weg, dies zu tun.
Geerlingguy
1
Danke, das hat funktioniert. Zur Erinnerung: Wenn doppelte Anführungszeichen verwenden, werden Sie noch müssen die entkommen$ , zum Beispiel: grep -FR "unset(\$foo['bar'])", sonst denkt , dass es es ist eine externe Variable und versucht sie zu erweitern
aexl
56

grep -Fist eine Standardmethode, um grepArgumente als feste Zeichenfolge und nicht als Muster zu interpretieren.

rkhayrov
quelle
1
Im Ernst, das hätte die akzeptierte Antwort sein sollen!
ankush981
Gute Antwort. Es löste mein Problem, als ich mit dem Befehl ssh eine Zeichenfolge mit $ durchsuchte. Das Escape mit "\" hat in diesem Szenario nicht funktioniert. Aber -F Flagge hat den Trick gemacht.
Rajasekhar
8

Sie müssen grep mit '-F' mitteilen, dass Sie anstelle eines Musters eine feste Zeichenfolge verwenden:

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

In dieser Frage geht es nicht um die grepInterpretation $als Regex. Es geht darum, dass die Shell $someVardurch den Wert der Umgebungsvariablen ersetzt wird someVar, wahrscheinlich durch die leere Zeichenfolge.

Im ersten Beispiel ist es so, als würde man grepohne Argument aufrufen , und deshalb erhalten Sie eine usageAusgabe. Das zweite Beispiel sollte nicht alle Zeilen zurückgeben, die someVarnur alle Zeilen enthalten, da sich die leere Zeichenfolge in allen Zeilen befindet.

Um die Shell anzuweisen, nicht zu ersetzen, müssen Sie '$someVar'oder verwenden \$someVar. Dann müssen Sie sich mit der Grep-Interpretation des $Charakters befassen , daher die grep -FOption, die in vielen anderen Antworten angegeben ist.

Eine gültige Antwort wäre also:

grep -ir "Something Here" * | grep '$someVar'
Christophe Drevet-Droguet
quelle
2

+1 für die -FOption ist dies die akzeptierte Antwort. Außerdem hatte ich ein "seltsames" Verhalten bei der Suche nach dem -I..Muster in meinen Dateien, da dies -Ials Option von angesehen wurde grep. Um solche Fehler zu vermeiden, können wir das Ende der Argumente des Befehls mit explizit angeben --.

Beispiel:

grep -HnrF -- <pattern> <files>

Hoffe das hilft jemandem.

Aloïké Go
quelle
Wofür steht F?
Arnold Roa
Von gnu.org/software/grep/manual/grep.html : "-F: Interpretieren Sie das Muster als eine Liste fester Zeichenfolgen (anstelle regulärer Ausdrücke), die durch Zeilenumbrüche getrennt sind, von denen jede übereinstimmen soll. (-F wird von POSIX angegeben.) "
Aloïké Go
Wenn --verwendet wird, kann -HnrFweggelassen werden?
Daniel
@Daniel Es hängt davon ab, was Sie tun möchten: Es wird -Fvermieden, das Muster als regulären Ausdruck zu --interpretieren , während es vermieden wird, darauf folgende Elemente als Optionen von grep zu interpretieren.
Aloïké Go
@ AloïkéGo Danke, ich verstehe.
Daniel