Überspringen von Zeilen, die einer Zeichenfolge entsprechen

8

Ich bin neu bei sed, also kann mir vielleicht jemand helfen. Ich modifiziere einige Dateien und möchte alle Zeilen überspringen, die die Zeichenfolgen "def" oder "page" haben. auf sie. Wie mache ich das in sed?

    
dylam 13.07.2011, 19:59
quelle

2 Antworten

17

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:

%Vor%

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%     
brandizzi 14.07.2011, 00:09
quelle
1

AFAIK Sie können nicht einfach übereinstimmende Zeilen mit sed negieren, aber so etwas wird fast funktionieren:

%Vor%

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.:

%Vor%

HTH

    
Zsolt Botykai 13.07.2011 20:33
quelle

Tags und Links