Regex für "oder" mehrerer Wörter in grep


12
[Computer]$ grep "foo|bar" filename

Ich verstehe, dass der obige Befehl jede Zeile im Dateinamen zurückgeben sollte, in der "foo" oder "bar" beendet wird. Die Manpages bestätigen | als Regex oder Symbol und der Code funktioniert für "foo" und "bar" unabhängig voneinander. Was vermisse ich?

Antworten:


21

grep verwendet standardmäßig grundlegende reguläre Ausdrücke (BRE). Von der Manpage:

Grundlegende vs erweiterte reguläre Ausdrücke: In regulären Grundausdrücken verlieren die Metazeichen ?, +, {, |, (Und) ihre besondere Bedeutung; Verwenden Sie stattdessen die Backslashed-Versionen \?, +, {, \ |, (und).

Sie müssen also entweder entkommen |:

grep "foo\|bar" filename 

oder aktivieren Sie erweiterte reguläre Ausdrücke:

grep -E "foo|bar" filename

Ich habe das auf der Manpage gesehen und missverstanden. Ich dachte, es bedeutete, dass \ | würde es nach dem vollständigen Ausdruck "foo | bar" im Gegensatz zu den einzelnen Ausdrücken suchen lassen. Danke für die schnelle Antwort!
Ocasta Eshu

4
Sie können auch egrep(einen Alias ​​für grep -E) anstelle von verwenden grep.
Speakr
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.