Welcher reguläre Ausdrucksstandard wird in grep verwendet?

Welcher reguläre Ausdrucksstandard wird in grep verwendet?

Ist der in grep verwendete reguläre AusdrucksstandardPOSIX + ASCIIoder ist da was anderes reingemischt?

Antwort1

Das hängt alles davon ab, welche Flags Sie an grep übergeben.

Das normale grep ohne Flags (das dasselbe ist wie die Übergabe von -G) verwendet „einfache reguläre Ausdrücke“:

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

Wenn Sie -E angeben, werden „erweiterte“ reguläre Ausdrücke verwendet:

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

Und dann haben Sie -P für reguläre Ausdrücke in Perl (PCRE):

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

Einfache vs. erweiterte reguläre Ausdrücke

In grundlegenden regulären Ausdrücken verlieren die Metazeichen ?, +, {, |, (, und )ihre besondere Bedeutung; verwenden Sie stattdessen die mit Backslashs versehenen Versionen \?, \+, \{, \|, \(, und \).

Traditionelles egrep unterstützte das {Metazeichen nicht und einige egrep-Implementierungen unterstützen es \{stattdessen. Portable Skripte sollten daher {-E-Muster in grep vermeiden und [{]zum Abgleichen mit einem Literal verwenden {.

GNU grep -E versucht, die traditionelle Verwendung zu unterstützen, indem angenommen wird, dass es {nichts Besonderes ist, wenn es der Beginn einer ungültigen Intervallspezifikation wäre. Beispielsweise grep -E '{1' sucht der Befehl nach der zweistelligen Zeichenfolge, {1anstatt einen Syntaxfehler im regulären Ausdruck zu melden. POSIX.2 erlaubt dieses Verhalten als Erweiterung, aber portable Skripte sollten es vermeiden.

Obwohl grep versucht, so nah wie möglich an POSIX zu sein, weist es dennoch einige Mängel auf.

verwandte Informationen