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).grep
.Sie haben Recht -
\w
ist Teil von PCRE - Perl - kompatiblen regulären Ausdrücken. Es ist jedoch nicht Teil des 'Standard'-Regex. http://www.regular-expressions.info/posix.htmlEinige Versionen von
sed
unterstützen es möglicherweise, aber ich würde vorschlagen, dass die einfachste Möglichkeit die Verwendungperl
imsed
Modus ist, indem Sie das-p
Flag angeben . (Zusammen mit dem-e
). (Weitere Einzelheiten inperlrun
)Aber
[]
in diesem Beispiel brauchen Sie das nicht zu umgehen - das ist für Gruppen von gültigen Sachen.Oder unter Windows:
Siehe
perlre
für mehr PCRE Zeug.Sie können Perl hier herunterladen: http://www.activestate.com/activeperl/downloads
quelle
\w
und[\w]
in meiner Frage. Ich werde es mit den Ausgaben der einzelnen Befehle aktualisieren, um zu verdeutlichen, welche funktionieren und welche nicht. Insbesonderesed
versteht\w
, aber nicht[\w]
. Außerdem muss ich[\w]
arbeiten, weil ich[\w/]
zum Beispiel verwenden möchte .perl
kann es tun :).\w
war in GNU grep (in den 80ern) bevor ich in Perl war und in GNU emacs wahrscheinlich sogar vorher.Ich vermute das
grep
undsed
entscheide unterschiedlich, wann die anzuwenden[]
und wann die zu erweitern sind\w
. In Perl\w
bedeutet Regex ein beliebiges Wortzeichen und[]
definiert eine Gruppe, um eines der Zeichen als Übereinstimmung anzuwenden. Wenn Sie das\w
vor dem "erweitern"[]
, wird es eine Zeichenklasse aller Wortzeichen sein. Wenn stattdessen tun Sie[]
zuerst finden Sie eine Zeichenklasse mit zwei Zeichen lang sein\
undw
so wäre es irgendein Muster entsprechen , die eine oder mehrere dieser beiden Zeichen.Es
sed
sieht also so aus, als würde das[]
und behandelt es so, als würde es die exakten Zeichen enthalten, die übereinstimmen, anstatt die spezielle Sequenz\w
wieperl
und zugrep
beachten. Natürlich[]
sind die in diesem Beispiel völlig unnötig, aber man könnte sich vielleicht Fälle vorstellen, in denen es wichtig wäre, aber dann könnten Sie dafür sorgen, dass es mit parens und ors funktioniert.quelle
\
ist ein Escape-Code, und Sie würden ihn verwenden, um Begrenzer zu maskieren. Inhärent bedeutet dies, dass es eine höhere Priorität haben muss als alles andere. Ich denke, es ist wahrscheinlicher, dass es nicht implementiert wird, weil\w
es nicht Teil der Spezifikation für reguläre Ausdrücke istecho whe\\ere | sed -r 's/[\w]+/gone/g
ich Gnused benutze: Gib mir,gonehegoneere
als würde es zu jedem der` and
W passen und die Substitution machen