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 ed
Skript:
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 perl
Ansatz (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 -0
lässt perl
die gesamte Datei ausschlürfen und das -p
weist es an, jede Eingabezeile auszudrucken, nachdem das von angegebene Skript angewendet wurde -e
. Das Skript selbst gleicht 58 F
s 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 sed
ein einzeiliger Vorausblick erzielt und dann P
werden 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.