Какой стандарт регулярного выражения используется в grep?

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

4
задан 01.05.2012, 11:43

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.

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

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

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

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

Таким образом, хотя grep стремится быть максимально близко к POSIX существуют все еще некоторые дефекты в нем.

7
ответ дан 07.12.2019, 19:56

Теги

Похожие вопросы