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