Regex dla „lub” wielu słów w grep

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

Rozumiem, że powyższe polecenie powinno zwracać każdą linię w nazwie pliku, z której wychodzi „foo” lub „bar”. Strony podręcznika potwierdzają | ponieważ Regex lub symbol i kod działają niezależnie dla „foo” i „bar”. czego mi brakuje?

Ocasta Eshu
źródło

Odpowiedzi:

21

grep domyślnie używa podstawowych wyrażeń regularnych (BRE). Ze strony podręcznika:

Podstawowe i rozszerzone wyrażenia regularne: w podstawowych wyrażeniach regularnych metaznaki?, +, {, |, (I) tracą swoje specjalne znaczenie; zamiast tego użyj wersji z odwrotnymi ukośnikami \ ?, +, {, \ |, (i).

Więc albo musisz uciec przed |:

grep "foo\|bar" filename 

lub włącz rozszerzone wyrażenia regularne:

grep -E "foo|bar" filename
jhenninger
źródło
Widziałem to na stronie podręcznika użytkownika i źle zrozumiałem. Myślałem, że to znaczy, że \ | sprawiłoby, że szukałoby pełnego wyrażenia „foo | bar” w przeciwieństwie do poszczególnych wyrażeń. Dzięki za szybką odpowiedź!
Ocasta Eshu
4
Możesz także użyć egrep(alias dla grep -E) zamiast grep.
przemówienie