Регулярное выражение для «или» нескольких слов в grep

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

Я понимаю, что приведенная выше команда должна возвращать каждую строку в имени файла, где есть "foo" или "bar". Справочные страницы подтверждают | как регулярное выражение или символ и код работает для «foo» и «bar» независимо. Что мне не хватает?

Окаста Эшу
источник

Ответы:

21

По умолчанию grep использует базовые регулярные выражения (BRE). Со страницы руководства:

Основные против расширенных регулярных выражений: в основных регулярных выражениях метасимволы?, +, {, |, (И) теряют свое особое значение; вместо этого используйте версии с обратной косой чертой \ ?, +, {, \ |, (и).

Так что вы либо должны избежать |:

grep "foo\|bar" filename 

или включите расширенные регулярные выражения:

grep -E "foo|bar" filename
jhenninger
источник
Я видел это в справочной странице и неправильно понял. Я думал, что это значит, что \ | заставил бы его искать полное выражение "foo | bar", а не отдельные выражения. Спасибо за быстрый ответ!
Окаста Эшу
4
Вы также можете использовать egrep(псевдоним для grep -E) вместо grep.
спикер