So passen Sie ein Muster an, löschen das Muster und auch die nächste und die vorherige Zeile unter Solaris 10

So passen Sie ein Muster an, löschen das Muster und auch die nächste und die vorherige Zeile unter Solaris 10

Wie kann ich ein Muster abgleichen, das Muster löschen und auch die nächste und die vorherige Zeile unter Solaris 10? Ich stoße auf ein Problem, da Solaris nicht mit GNU sed geliefert wird. Gegeben sei der folgende Dateiinhalt:

    LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Ich möchte den Block entfernen, der Folgendes enthält:

    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }

Die Datei wäre:

LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Um die nächste Zeile zu löschen, habe ich Folgendes eingegeben:

sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt

Was ist mit der Zeile, die übereinstimmt, und der vorherigen Zeile?

Vielleicht lässt es sich mit ed oder vi erreichen? Danke!

Antwort1

Hier ist ein edSkript:

ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!

Es schreibt die Ausgabe in eine Datei newfile.txt.


Die „globale“ Wiederholung davon ist

ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!

Antwort2

Ein perlAnsatz (vorausgesetzt, Ihre Datei ist klein genug, um in den Speicher geladen zu werden):

perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file

Das -0lässt perldie gesamte Datei ausschlürfen und das -pweist es an, jede Eingabezeile auszudrucken, nachdem das von angegebene Skript angewendet wurde -e. Das Skript selbst gleicht 58 Fs und die beiden umgebenden Zeilen ab und entfernt sie.

Antwort3

sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out

Dadurch wird sedein einzeiliger Vorausblick erzielt und dann Pwerden nur die Zeilen ausgegeben, die nicht zu Ihrer Reihe passen, da eine weitere Zeile gesprungen wird und der Puffer geleert wird, wenn die ersten beiden Zeilen übereinstimmen.

verwandte Informationen