Das hat historische Gründe.
Regexp wurde ed
Anfang der 70er Jahre erstmals in Unix im Dienstprogramm eingeführt . Obwohl ed
stützte sich auf qed
deren Umsetzung durch die gleichen Autoren komplexere regexp verstanden, ed
verstanden 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
ed
Befehl 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
ed
Befehl 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 egrep
und awk
Dienstprogrammen 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 awk
bis Version 4.0.0 (2011) nur unterstützt, {
wenn es in den POSIX-Konformitätsmodus versetzt wurde.
wenn GNU grep
in 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 (.)\1
in GNU tun egrep
(obwohl dies nicht POSIX ist oder von vielen anderen Implementierungen einschließlich GNU unterstützt wird awk
).
Das Hinzufügen von \x
Operatoren ist nicht die einzige Möglichkeit, weitere Operatoren abwärtskompatibel hinzuzufügen. Zum Beispiel perl
verwendet (?...)
. Das ist immer noch abwärtskompatibel mit EREs, da (?=...)
dies in EREs nicht gültig ist .*?
. vim
für ähnliche Betreiber hat es anders gemacht durch Einführung \@=
oder .\{-}
zum Beispiel.