Auf diese Weise können Sie mit sed einen nicht gierigen Abgleich von Zeichenfolgen mit mehreren Zeichen durchführen. Nehmen wir an, Sie möchten jeden ändern foo...bar
, <foo...bar>
zum Beispiel diese Eingabe:
$ cat file
ABC foo DEF bar GHI foo KLM bar NOP foo QRS bar TUV
sollte diese Ausgabe werden:
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
Dazu konvertieren Sie foo und bar in einzelne Zeichen und verwenden dann die Negation dieser Zeichen zwischen ihnen:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/g; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC <foo DEF bar> GHI <foo KLM bar> NOP <foo QRS bar> TUV
In obigem:
s/@/@A/g; s/{/@B/g; s/}/@C/g
konvertiert {
und }
in Platzhalterzeichenfolgen, die in der Eingabe nicht vorhanden sein können, sodass diese Zeichen dann zum Konvertieren foo
und bar
in verfügbar sind .
s/foo/{/g; s/bar/}/g
konvertiert foo
und bar
zu {
und }
jeweils
s/{[^{}]*}/<&>/g
führt die Operation aus, die wir wollen - konvertieren foo...bar
zu<foo...bar>
s/}/bar/g; s/{/foo/g
konvertiert {
und }
zurück zu foo
und bar
.
s/@C/}/g; s/@B/{/g; s/@A/@/g
konvertiert die Platzhalterzeichenfolgen zurück in ihre ursprünglichen Zeichen.
Beachten Sie, dass das oben Gesagte nicht davon abhängt, dass eine bestimmte Zeichenfolge nicht in der Eingabe vorhanden ist, da diese Zeichenfolgen im ersten Schritt hergestellt werden, und es auch nicht wichtig ist, mit welchem Vorkommen eines bestimmten regulären Ausdrucks Sie übereinstimmen möchten, da Sie ihn {[^{}]*}
so oft wie nötig verwenden können im Ausdruck, um die gewünschte tatsächliche Übereinstimmung und / oder mit dem numerischen Übereinstimmungsoperator seds zu isolieren, z. B. um nur das zweite Vorkommen zu ersetzen:
$ sed 's/@/@A/g; s/{/@B/g; s/}/@C/g; s/foo/{/g; s/bar/}/g; s/{[^{}]*}/<&>/2; s/}/bar/g; s/{/foo/g; s/@C/}/g; s/@B/{/g; s/@A/@/g' file
ABC foo DEF bar GHI <foo KLM bar> NOP foo QRS bar TUV