Используется ли стандарт регулярных выражений в grep POSIX + ASCII или что-то еще?

1 ответ1

3

Все зависит от того, какие флаги вы передаете grep.

Обычный grep без флага (который совпадает с передачей -G) использует "Базовые регулярные выражения":

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

Если вы укажете -E, он будет использовать "Расширенные" регулярные выражения:

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

И тогда у вас есть -P для регулярных выражений Perl (PCRE):

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

Основные против расширенных регулярных выражений

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

Традиционный egrep не поддерживает {метасимвол, а некоторые реализации egrep поддерживают {вместо этого, поэтому переносимые скрипты должны избегать {в шаблонах grep -E и использовать [{] для соответствия литералу {.

GNU grep -E пытается поддерживать традиционное использование, предполагая, что {не является особенным, если это будет началом неверной спецификации интервала. Например, команда grep -E '{1' ищет двухсимвольную строку {1 вместо сообщения о синтаксической ошибке в регулярном выражении. POSIX.2 допускает такое поведение как расширение, но переносимые сценарии должны избегать этого.

Поэтому, хотя grep стремится быть как можно ближе к POSIX, в нем все же есть некоторые недостатки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .