Проблема з виразними проблемами "АБО"


65

Я намагаюся використовувати grep з регулярним виразом, щоб знайти рядки у файлі, які відповідають 1 з 2 можливих рядків. Ось моя принада:

$ grep "^ID.*(ETS|FBS)" my_file.txt

Вищеописаний греп не дає результатів. Однак якщо я виконую будь-яке:

$ grep "^ID.*ETS" my_file.txt  

або

$ grep "^ID.*FBS" my_file.txt  

Я збігаюся з певними лініями. Чому мій регекс АБО не відповідає? Заздалегідь дякую за допомогу!

Відповіді:


94

При нормальних умовах регулярних виразів, символів (, |і )необхідність бути екрановані. Тож вам слід користуватися

$ grep "^ID.*\(ETS\|FBS\)" my_file.txt

Вам не потрібні втечі, коли ви використовуєте розширений параметр regex ( -E). Дивіться man grepрозділ " Basic vs Extended Regular Expressions".


10
Ви також можете використовувати egrepзамість grep -E.
Ріккардо Муррі

2
@RiccardoMurri У відповіді Міхала сказано, що egrep (і fgrep) застаріли (навіть якщо вони все ще можуть працювати).
Тимо

27

Якщо ви хочете використовувати декілька гілок ( |як or), то, щоб бути більш сумісними, краще чітко сказати, що ви хочете використовувати "сучасний RE" ака. ЕРЕ.

Для цього використовуйте grep -E :

grep -E "^ID.*(ETS|FBS)" my_file.txt

Щоб дізнатися більше про RE, ERE та всю "сучасну" історію ER, див man 7 regex.

Можна також використовувати egrepзамість grep, але як ви можете прочитати з man grep:

egrep те саме, що і grep -E. fgrep - це те саме, що і grep -F

(...)

Прямий виклик або як поставити розширену або fgrep є застарілим


Хоча пряме виклик egrep застаріле, воно працюватиме у більшості * nix варіантів.
Марк D
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.