Verschiedene Tools und Versionen davon unterstützen verschiedene Varianten von regulären Ausdrücken. In der Dokumentation der einzelnen Artikel erfahren Sie, was sie unterstützen.
Es gibt Standards, mit denen man sich auf ein Minimum an Funktionen verlassen kann, die für alle konformen Anwendungen verfügbar sind.
Zum Beispiel alle modernen Implementierungen sed
und grep
Implementierungen grundlegender regulärer Ausdrücke gemäß POSIX (mindestens die eine oder andere Version des Standards, aber dieser Standard hat sich diesbezüglich in den letzten Jahrzehnten nicht wesentlich weiterentwickelt).
In POSIX BRE und ERE haben Sie die [:alnum:]
Zeichenklasse. Das stimmt mit Buchstaben und Ziffern in Ihrem Gebietsschema überein (beachten Sie, dass dies oft viel mehr umfasst, als a-zA-Z0-9
wenn das Gebietsschema C ist).
So:
grep -x '[[:alnum:]_]\{1,\}'
stimmt mit einem oder mehreren Alumni oder _ überein.
[\w]
wird von POSIX benötigt, um entweder mit einem Backslash oder mit einem Backslash übereinzustimmen w
. Sie werden also keine grep
oder eine sed
Implementierung finden, wo diese verfügbar ist (es sei denn, dies erfolgt über nicht standardmäßige Optionen).
Das Verhalten für \w
Alleine wird von POSIX nicht spezifiziert, daher dürfen Implementierungen tun, was sie wollen. GNU grep
hat das vor langer Zeit hinzugefügt.
grep
Früher hatte GNU eine eigene Regexp-Engine, jetzt verwendet es jedoch die der GNU-Libc (obwohl es eine eigene Kopie einbettet).
Es soll zu Alumni und Unterstrich in Ihrem Gebietsschema passen. Es hat jedoch derzeit den Fehler, dass es nur Einzelbyte-Zeichen entspricht (z. B. nicht in einem UTF-8-Gebietsschema, obwohl dies eindeutig ein Buchstabe ist und obwohl es in allen Gebietsschemas übereinstimmt, in denen es sich um ein einzelnes Zeichen handelt Charakter).
Es gibt auch einen \w
Regexp-Operator in Perl-Regexp und in PCRE. PCRE / Perl sind keine regulären POSIX-Ausdrücke, sondern nur eine andere Sache.
Mit der Art und Weise, wie GNU grep -P
PCRE verwendet, hat es das gleiche Problem wie ohne -P
. Es kann jedoch mithilfe von umgangen werden (*UCP)
(obwohl dies auch Nebenwirkungen in Nicht-UTF8-Gebietsschemas hat).
GNU sed
verwendet auch die regulären Ausdrücke der GNU libc für ihre eigenen regulären Ausdrücke. Es benutzt es so, dass es nicht den gleichen Fehler wie GNU hat grep
.
GNU sed
unterstützt keine PCREs. Der Code enthält einige Beweise dafür, dass es schon einmal versucht wurde, aber er scheint nicht mehr auf der Tagesordnung zu stehen.
Wenn Sie reguläre Ausdrücke von Perl möchten, verwenden Sie einfach perl
.
Ansonsten würde ich sagen, dass es besser ist, den Standard und die Verwendung beizubehalten, als sich auf eine falsche Nicht-Standard-Funktion Ihrer speziellen Implementierung von sed
/ zu verlassen .grep
[_[:alnum:]]
[_[:alnum:]]
ist eine nette Abhilfemaßnahme, mit der ich es genau so erweitern kann[\w/]
([_[:alnum:]/]
in diesem Fall).