Input.txt:
8B0C
remove
8B0D
remove
8B0E
remove
8B0F
8B10
remove
8B14
remove
8B15
remove
8B16
remove
8B17
remove
8AC0
8AC1
remove
8AC2
remove
8AC3
remove
8AE4
8AE5
8AE6
remove
Gewünschte Ausgabe:
8B0F
8AC0
8AE4
8AE5
Ich möchte eine Zeile drucken, wenn diese oder die nächste Zeile nicht "Entfernen" enthält. Ich benutze Solaris 5.10, KSH.
text-processing
sed
awk
solaris
ayrton_senna
quelle
quelle
Antworten:
Mit
sed
:Dadurch wird die
N
ext-Linie in den Musterraum gezogen (falls nicht!
in der$
letzten Zeile) und geprüft, ob der Musterraum übereinstimmtremove
. Wenn dies nicht der Fall ist (dh , keine der beiden Zeilen im Musterbereich enthält die Zeichenfolgeremove
),P
wird bis zum ersten\n
Ewline-Zeichen gedruckt (dh es wird die erste Zeile gedruckt). Dann wirdD
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 derN
im Musterraum aussehen:Verwenden Sie also nur die letzten sechs Zeilen aus Ihrem Beispiel:
Der letzte Befehl gibt Folgendes aus:
Hier ist eine kurze Erklärung:
quelle
quelle
Die obige Methode liest Datensätze nicht zeilenweise , sondern liest mehrzeilige Datensätze von einem Datensatztrenner (RS) zum nächsten (oder Dateiende) -
RS
wobei dies die "Entfernen" -Zeile selbst (einschließlich ihrer) ist nachstehend `\ n).Der
!RT
Test wird benötigt, wenn die letzte Zeile keineRS
Zeile ist.RT
, ein Gawk-Ismus , ist der eigentliche Text des aktuellen DatensatzesRS
.gensub
ist auch ein Gawk-Ismus .Wenn Sie eine Markierungslinie überprüfen müssen , dass Streichhölzer „Entfernen“ überall in der Linie, gegenüber einer Linie , die gleich auf „Entfernen“, dann ändern Sie einfach den Record - Separator zu:
Ausgabe:
quelle