
Является ли стандарт регулярных выражений, используемый в 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, в нем все еще есть некоторые недостатки.