Wenn ich es gut verstanden habe, möchten Sie einige Änderungen an verschiedenen Zeilen vornehmen, mit Ausnahme einer Zeile, die mit einer Regex übereinstimmt, oder? In diesem Fall nehme ich an, ich habe die folgende Datei:
%Vor% Wir wollen alle this
durch that
ersetzen, aber die Zeilen ignorieren, die nach def
oder page
enthalten. Zuerst löschen wir die Zeilen, die mit def
oder page
beginnen:
Dann wenden wir unsere Operation wie gewohnt an:
%Vor%Das Ergebnis ist:
%Vor%Aber wenn Sie mit "Überspringen" meinen "meine Operationen nicht anwenden", negieren Sie einfach die Adresse:
%Vor%Die obige Aussage ist korrekt. Interessanterweise ist der "oder" Operator mit "erweitertem regulären Ausdruck" verbunden. Daher müssen Sie -E für "erweiterten regulären Ausdruck" angeben, da sed standardmäßig nur "reguläre Grundausdrücke" verwendet.
Zum Beispiel funktioniert die folgende Anweisung nicht:
%Vor%Aber diese Aussage unten funktioniert:
%Vor% AFAIK Sie können nicht einfach übereinstimmende Zeilen mit sed
negieren, aber so etwas wird fast funktionieren:
es ersetzt foo
durch bar
in den Zeilen, die nicht def
oder page
enthalten, aber catch bedeutet, dass "übereinstimmende" Zeilen mindestens 4 Zeichen lang sein müssen.
Eine bessere Lösung ist die Verwendung von awk
, z. B.:
HTH
Tags und Links sed