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


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

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

Ответы:


21

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

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

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

grep "foo\|bar" filename 

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

grep -E "foo|bar" filename

Я видел это в справочной странице и неправильно понял. Я думал, что это значит, что \ | заставил бы его искать полное выражение "foo | bar", а не отдельные выражения. Спасибо за быстрый ответ!
Окаста Эшу

4
Вы также можете использовать egrep(псевдоним для grep -E) вместо grep.
спикер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.