Как использовать регулярное выражение ИЛИ в grep в Cygwin? - PullRequest
51 голосов
/ 24 октября 2011

Мне нужно вернуть результаты для двух разных совпадений из одного файла.

grep "string1" my.file

правильно возвращает единственный экземпляр строки1 в my.file

grep "string2" my.file

правильно возвращает единственныйЭкземпляр string2 в my.file

, но

grep "string1|string2" my.file

ничего не возвращает

в тестовых приложениях регулярного выражения, синтаксис правильный, так почему он не работает для grep в cygwin

Ответы [ 4 ]

76 голосов
/ 24 октября 2011

Использование символа | без экранирования его в основном регулярном выражении будет соответствовать только литералу |. Например, если у вас есть файл с содержимым

string1
string2
string1|string2

Использование grep "string1|string2" my.file будет соответствовать только последней строке

$ grep "string1|string2" my.file
string1|string2

Чтобы использовать оператор чередования |, вы можете:

  1. Используйте базовое регулярное выражение (просто grep) и экранируйте символ | в регулярном выражении

    grep "string1\|string2" my.file

  2. Используйте расширенное регулярное выражение с egrep или grep -E, как Джулиан уже указал в его ответ

    grep -E "string1|string2" my.file

  3. Если вы хотите сопоставить два разных шаблона, вы также можете указать их отдельно в -e опциях:

    grep -e "string1" -e "string2" my.file

Вам могут пригодиться следующие разделы справки grep:

10 голосов
/ 24 октября 2011

Возможно, вам придется либо использовать egrep, либо grep -E.Символ трубы ИЛИ является частью расширенного grep и может не поддерживаться базовым языком Cygwin.

Кроме того, вам, вероятно, необходимо экранировать символ трубы.

6 голосов
/ 26 октября 2012

Лучший и самый понятный способ, который я нашел, это: grep -e REG1 -e REG2 -e REG3 _FILETOGREP_

Я никогда не использую трубу, так как это менее очевидно и очень неудобно работать.

0 голосов
/ 24 октября 2011

Вы можете найти эту информацию, прочитав прекрасное руководство: grep (1), которое вы можете найти, запустив 'man grep'.Он описывает разницу между grep и egrep, а также базовыми и регулярными выражениями, а также много другой полезной информации о grep.

...