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.


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:



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


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.


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

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'

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.