Как использовать регулярное выражение OR в grep в Cygwin?
Мне нужно вернуть результаты для двух разных совпадений из одного файла.
grep "string1" my.file
правильно возвращает единственный экземпляр string1 в my.file
grep "string2" my.file
правильно возвращает единственный экземпляр string2 в my.file
но
grep "string1|string2" my.file
ничего не возвращает
В тестовых приложениях regex этот синтаксис правильный, поэтому почему он не работает для grep в cygwin?
Ответы
Ответ 1
Использование символа |
без экранирования в основном регулярном выражении будет соответствовать только литералу |
. Например, если у вас есть файл с содержимым
string1
string2
string1|string2
Использование grep "string1|string2" my.file
будет соответствовать только последней строке
$ grep "string1|string2" my.file
string1|string2
Чтобы использовать оператор чередования |
, вы можете:
-
Используйте основное регулярное выражение (просто grep
) и избегайте символа |
в регулярном выражении
grep "string1\|string2" my.file
-
Используйте расширенное регулярное выражение с egrep
или grep -E
, поскольку Юлиан уже указал в его ответ
grep -E "string1|string2" my.file
-
Если это два разных шаблона, которые вы хотите сопоставить, вы также можете указать их отдельно в параметрах -e
:
grep -e "string1" -e "string2" my.file
Вы можете найти следующие разделы справочника grep
:
Ответ 2
Вам может потребоваться либо использовать egrep
, либо grep -E
. Символ трубы OR является частью расширенного grep и может не поддерживаться основным Cygwin grep.
Кроме того, вам, вероятно, нужно избежать символа трубы.
Ответ 3
Самый лучший и самый понятный способ, который я нашел, - это:
grep -e REG1 -e REG2 -e REG3 _FILETOGREP _
Я никогда не использую трубу, поскольку она менее очевидна и очень неудобна для работы.
Ответ 4
Вы можете найти эту информацию, прочитав точное руководство: grep (1), которое вы можете найти, запустив "man grep". В нем описывается разница между grep и egrep, а также основные и регулярные выражения, а также много полезной информации о grep.