Mit sed
:
sed '$!N;/remove/!P;D' infile
Dadurch wird die N
ext-Linie in den Musterraum gezogen (falls nicht !
in der $
letzten Zeile) und geprüft, ob der Musterraum übereinstimmt remove
. Wenn dies nicht der Fall ist (dh , keine der beiden Zeilen im Musterbereich enthält die Zeichenfolge remove
), P
wird bis zum ersten \n
Ewline-Zeichen gedruckt (dh es wird die erste Zeile gedruckt). Dann wird D
bis zum ersten \n
Ewline-Zeichen geöffnet und der Zyklus neu gestartet. Auf diese Weise befinden sich nie mehr als zwei Linien im Musterraum.
Es ist wahrscheinlich einfacher zu verstehen , die N
, P
, D
Zyklus , wenn Sie hinzufügen , l
vor und nach der N
im Musterraum aussehen:
sed 'l;$!N;l;/remove/!P;D' infile
Verwenden Sie also nur die letzten sechs Zeilen aus Ihrem Beispiel:
8AC3
remove
8AE4
8AE5
8AE6
remove
Der letzte Befehl gibt Folgendes aus:
8AC3 $
8AC3 \ n $ entfernen
entferne $
entferne \ n 8AE4 $
8AE4 $
8AE4 \ n 8AE5 $
8AE4
8AE5 $
8AE5 \ n 8AE6 $
8AE5
8AE6 $
8AE6 \ n $ entfernen
entferne $
entferne $
Hier ist eine kurze Erklärung:
cmd Ausgabe cmd
l 8AC3$ N # read in the next line
l 8AC3\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ N # read in the next line
l remove\n 8AE4$ D # delete up to \n (pattern space matches so no P)
l 8AE4$ N # read in the next line
l 8AE4\n 8AE5$ # pattern space doesn't match so print up to \n
P 8AE4 D # delete up to \n
l 8AE5$ N # read in the next line
l 8AE5\n 8AE6$ # pattern space doesn't match so print up to \n
P 8AE5 D # delete up to \n
l 8AE6$ N # read in the next line
l 8AE6\n remove$ D # delete up to \n (pattern space matches so no P)
l remove$ # last line so no N
l remove$ D # delete (pattern space matches so no P)