Es scheint zB,
cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g'
dass ich Zeichen entkommen muss , um einen regulären Ausdruck zu bilden. In diesem Fall musste ich Zahnspangen entkommen, um mehrmals interpretiert zu werden.
Warum? Ich hatte erwartet, dass alles ein Regex-Charakter sein würde, wenn es nicht entkommen würde. Dh das Gegenteil.
11
s/regex//g
bereits einen Regex und ich würde erwarten, dass es Text ist, der benötigt wird zu entkommenAntworten:
Dies liegt daran ,
sed
Anwendungen POSIX BREs (Grund Regular Expressions) in Bezug auf die EREs gegen (Reguläre Ausdrücke Extended) Sie wahrscheinlich von Perl oder Freunden verwendet.Von der
sed(1)
Manpage:Relevantes Zitat aus dem obigen Link:
Wörtlich zitiert aus Craig Sanders 'Kommentar :
quelle
-r
oder zu verwenden--regexp-extended
. Dies ist nützlich, wenn Sie vermeiden möchten, Ihr sed-Skript durch übermäßiges Escape zu hässlich zu machen.sed
Implementierungen (wenn sie EREs unterstützen, meistens BSDs) verwenden dies eher-E
(was viel sinnvoller ist, da dies die gleiche Option ist wie fürgrep
. Warum GNUsed
gewählt hat,-r
ist mir ein Rätsel).Das hat historische Gründe.
Regexp wurde
ed
Anfang der 70er Jahre erstmals in Unix im Dienstprogramm eingeführt . Obwohled
stützte sich aufqed
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 verwendets/foo() {/foo (var) {/g
, um alle Instanzen vonfoo() {
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 ists/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 dens
ed
Befehl hinzugefügt , Dinge wies/foo\(.\)/\1bar/
und später alsgrep '\(.\)\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
undawk
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 altemqed
(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 GNUawk
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 tungrep
(obwohl dies nicht POSIX ist oder von anderen Implementierungen unterstützt wird) und Sie können dies(.)\1
in GNU tunegrep
(obwohl dies nicht POSIX ist oder von vielen anderen Implementierungen einschließlich GNU unterstützt wirdawk
).Das Hinzufügen von
\x
Operatoren ist nicht die einzige Möglichkeit, weitere Operatoren abwärtskompatibel hinzuzufügen. Zum Beispielperl
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.quelle