Das hat historische Gründe.
Regexp wurde edAnfang der 70er Jahre erstmals in Unix im Dienstprogramm eingeführt . Obwohl edstützte sich auf qedderen Umsetzung durch die gleichen Autoren komplexere regexp verstanden, edverstanden nur ^, $, [...], ., *und \alle oben zu entkommen.
Als nun die Notwendigkeit bestand, mehr Operatoren zu haben, musste ein Weg gefunden werden, diese einzuführen, ohne die Abwärtskompatibilität zu beeinträchtigen. Wenn ein Skript den s edBefehl verwendet s/foo() {/foo (var) {/g, um alle Instanzen von foo() {durch zu ersetzen, foo(var) { und Sie einen (oder {-Operator eingeführt haben, würde dieses Skript beschädigt.
Allerdings würde kein Skript ausreichen s/foo\(\) {/foo\(var\) {/, da dies dasselbe ist s/foo() {/foo(var) {/und es keinen Grund gab, zu entkommen, (da dies kein RE-Operator war. Die Einführung eines neuen \(oder \{Operators beeinträchtigt also nicht die Abwärtskompatibilität, da es sehr unwahrscheinlich ist, dass ein vorhandenes Skript mit der älteren Syntax beschädigt wird.
So wurde es gemacht. Später \(...\)wurde zunächst nur für den s edBefehl hinzugefügt , Dinge wie s/foo\(.\)/\1bar/und später als grep '\(.\)\1'(aber noch nicht wie \(xx\)*) zu tun .
In UnixV7 (1979, also fast ein Jahrzehnt später) wurde eine neue Form von regulären Ausdrücken in den neuen egrepund awkDienstprogrammen hinzugefügt, die als erweiterter regulärer Ausdruck bezeichnet werden (da es sich um neue Tools handelt, kann keine Abwärtskompatibilität unterbrochen werden). Endlich, sofern sie mit der Funktionalität in dem Ken Thompson altem qed(Wechsel Operator |, Gruppierung (..)*) und einige Operatoren hinzugefügt wie +und ?(aber nicht über das backref Merkmal der grundlegenden regulären Ausdrücken).
Später fügten die BSDs \<und \>(sowohl zu BRE als auch zu ERE) hinzu, und SysV fügte hinzu \{und nur \}zu BREs.
Es ist nicht viel später als {und }wurden zu ERE hinzugefügt, durch solche brechende Abwärtskompatibilität. Nicht jeder hat es hinzugefügt. Beispielsweise wurde GNU awkbis Version 4.0.0 (2011) nur unterstützt, {wenn es in den POSIX-Konformitätsmodus versetzt wurde.
wenn GNU grepin den frühen 90er Jahren geschrieben wurde, hat es alle guten Sachen von beiden BSD und SysV (wie \<, {) und anstelle von zwei getrennten regexp - Syntax und Motor für BRE und ERE, die gleichen Operatoren in beiden implementiert werden nur die BRE Pendants von (, ?, {, +mit einem umgekehrten Schrägstrich werden müssen voran (kompatibel sein mit anderen Implementierungen BRE). Aus diesem Grund können Sie dies .\+in GNU tun grep(obwohl dies nicht POSIX ist oder von anderen Implementierungen unterstützt wird) und Sie können dies (.)\1in GNU tun egrep(obwohl dies nicht POSIX ist oder von vielen anderen Implementierungen einschließlich GNU unterstützt wird awk).
Das Hinzufügen von \xOperatoren ist nicht die einzige Möglichkeit, weitere Operatoren abwärtskompatibel hinzuzufügen. Zum Beispiel perlverwendet (?...). Das ist immer noch abwärtskompatibel mit EREs, da (?=...)dies in EREs nicht gültig ist .*?. vimfür ähnliche Betreiber hat es anders gemacht durch Einführung \@=oder .\{-}zum Beispiel.