Используется ли стандарт регулярных выражений в grep POSIX + ASCII или что-то еще?
1 ответ
Все зависит от того, какие флаги вы передаете 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, в нем все же есть некоторые недостатки.