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?

Ocasta Eshu
quelle

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
jhenninger
quelle
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