Ich habe eine Datei alphanum
mit diesen beiden Zeilen:
123 abc
this is a line
Ich bin verwirrt, warum ich beim Ausführen sed 's/[a-z]*/SUB/' alphanum
die folgende Ausgabe erhalte:
SUB123 abc
SUB is a line
Ich habe erwartet:
123 SUB
SUB is a line
Ich habe ein Update gefunden ( sed 's/[a-z][a-z]*/SUB/'
stattdessen verwenden), aber ich verstehe nicht, warum es funktioniert und meins nicht.
Kannst du helfen?
sed
regular-expression
Fakher Mokadem
quelle
quelle
ls foo*
dort verwendet). Wenn Sie jedoch doppelte Fragen finden, sollten Sie diese auch als solche kennzeichnen können.Antworten:
Das Muster
[a-z]*
entspricht null oder mehr Zeichen im Bereicha
vonz
(die tatsächlichen Zeichen hängen vom aktuellen Gebietsschema ab). Es gibt null solcher Zeichen am Anfang der Zeichenfolge123 abc
(dh das Muster stimmt überein) und auch vier davon am Anfang vonthis is a line
.Wenn Sie mindestens eine Übereinstimmung benötigen , verwenden Sie
[a-z][a-z]*
oder[a-z]\{1,\}
oder aktivieren Sie erweiterte reguläre Ausdrücke mitsed -E
und verwenden Sie[a-z]+
.Fügen Sie Klammern um jede Übereinstimmung hinzu, um zu visualisieren, wo das Muster übereinstimmt:
Oder um alle Übereinstimmungen in den Zeilen zu sehen:
Vergleichen Sie das letzte Ergebnis mit
quelle
[a-z]
Spiele Zusammentragelemente , die aus mehr als einem Zeichen gemacht werden kann. Zum Beispiel in einigen ungarischen Gegenden[a-z]
Spiele amdzs
Da
*
Streichhölzer null oder mehr Wiederholungen des vorherigen Atom und alle regex Motoren versuchen , das erste Spiel zu finden. Am Anfang Ihrer Zeichenfolge befindet sich eine Teilzeichenfolge mit genau null Buchstaben. In dem Fall, in dem die Zeichenfolge mit einem Buchstaben beginnt, werden*
so viele Übereinstimmungen wie möglich angezeigt. Dies ist jedoch zweitrangig, um die Übereinstimmung ganz links zu finden.Übereinstimmungen mit der Länge Null können etwas problematisch sein. Wie Sie gesehen haben, besteht die Lösung darin, das Muster so zu ändern, dass mindestens ein Zeichen erforderlich ist. Mit erweiterten regulären Ausdrücken könnten Sie
+
dafür:sed -E 's/[a-z]+/SUB/'
Versuchen Sie zum Spaß:
quelle