Lerne sed zusammen (vier)

Wie awk führt sed Befehle zeilenweise aus. Wenn unsere Operation auf mehrere Zeilen ausgelegt ist, müssen wir den Parameter "N" zum Deklarieren verwenden.
"N" bedeutet die nächste Zeile der aktuellen Operation, und die aktuelle Zeile und die nächste Zeile werden als eine Einheit für den Betrieb betrachtet.
Sehen Sie sich beispielsweise das Ergebnis des folgenden Befehls an.

sed '=;N' example.txt
# 1
# This is a test file.
# It is the last day of 2018.
# 3
# Hope all you success!
# HAPPY NEW YEAR!

Unter diesen steht "=" für die Zeilennummer. Wenn sed den Befehl ausführt, führen Sie ihn zuerst für die erste Zeile aus, geben Sie die Zeilennummer "1" aus, führen Sie dann "N" aus und geben Sie die zweite Zeile und die erste Zeile als Bedieneinheit aus, da die zweite Zeile bereits bedient wurde Wenn Sie hier also '=; N' ausführen, geben Sie ausgehend von der dritten Zeile die Zeilennummer "3" und dann die dritte und vierte Zeile aus.
Wenn Sie die obige Reihenfolge umkehren

 sed 'N;=' example.txt
# 2
# This is a test file.
# It is the last day of 2018.
# 4
# Hope all you success!
# HAPPY NEW YEAR

Das Obige dient dazu, die beiden Zeilen zu einer Bedieneinheit zusammenzuführen und dann die Zeilennummer auszugeben. Beachten Sie, dass die Zeilennummer die zweite Zeile ist.

Das Obige ist der Fall bei geraden Zeilen, wie z. B. ungeraden Zeilen. Dann beendet die letzte Zeile den Befehl sed, da die nächste Zeile nicht gefunden wird.

 sed '$a The last line!' example.txt | sed "N;="
# 2
# This is a test file.
# It is the last day of 2018.
# 4
# Hope all you success!
# HAPPY NEW YEAR!
# The last line!

Wenn die letzte Zeile ausgeführt wurde, wurde die nächste Zeile nicht gefunden, sodass der folgende Befehl "=" nicht ausgeführt wird! Dies muss beachtet werden, da sonst leicht Fehler auftreten können.

Wenn Sie 3 Zeilen als Bedieneinheit verwenden möchten, können Sie sie auf die gleiche Weise mit zwei "N" darstellen.

sed '=;N;N' example.txt
# 1
# This is a test file.
# It is the last day of 2018.
# Hope all you success!
# 4
# HAPPY NEW YEAR!

Anwendung: Kombinieren Sie zwei Zeilen zu einer Zeile

Führen Sie beispielsweise zwei benachbarte Zeilen zusammen, die mit einem Ausrufezeichen enden. Ist es möglich folgendes zu schreiben:

sed '/!$/s/\n//g' example.txt

Suchen Sie zuerst die Zeile, die mit dem Ausrufezeichen endet, und löschen Sie dann das Zeilentrennzeichen "\ n" nach der Zeile! Diese Methode ist jedoch falsch! ! Da sed in einer einzelnen Zeileneinheit verarbeitet wird, gibt sed das Ergebnis auch dann in einer einzelnen Zeile aus, wenn Sie das Zeilentrennzeichen einer Zeile löschen. Daher lautet die korrekte Schreibweise:

sed '/!$/{N;s/\n//g}' example.txt
# This is a test file.
# It is the last day of 2018.
# Hope all you success!HAPPY NEW YEAR!

Erweiterung: sed Cache

Sed hat zwei Arten von Caching, eine ist Musterpuffer, die andere ist Haltepuffer. Der Mustercache ist die Zeile, die Sie gerade auswählen und lesen. Der temporäre Cache ähnelt eher einem Langzeitspeicherplatz. Während der Ausführung von sed können Sie verwandte Inhalte im temporären Cache speichern, die an einer beliebigen Stelle in der nachfolgenden sed-Ausführung aufgerufen werden können Inhalt im Cache. Für diese beiden Cache-Vorgänge gibt es die folgenden häufig verwendeten Befehle:

h: Kopieren Sie den Inhalt im Moduspuffer in den temporären Puffer und überschreiben Sie den Inhalt im vorherigen temporären Puffer.
H: Fügen Sie den Inhalt im Moduspuffer zum temporären Puffer hinzu und behalten Sie den Inhalt im vorherigen temporären Puffer bei.
g: Bleiben Sie Der Inhalt im Cache wird in den Moduspuffer kopiert und überschreibt den Inhalt im aktuellen Moduscache.
G: Der Inhalt im temporären Cache wird dem Moduspuffer hinzugefügt und der Inhalt im aktuellen Moduscache bleibt erhalten.
Die Einführung dieser Cache-Konzepte macht sed jedoch zu kompliziert Es ist schwer zu verstehen, daher werde ich nicht näher darauf eingehen. Hier nur ein Beispiel: Alle Zeilen in einem Text in umgekehrter Reihenfolge ausgeben

sed -n '1!G;h;$p' example.txt 
# HAPPY NEW YEAR!
# Hope all you success!
# It is the last day of 2018.
# This is a test file.

Verwenden Sie für die erste Zeile "!", Um anzuzeigen, dass G nicht ausgeführt wird, da der temporäre Puffer zu diesem Zeitpunkt leer ist und der temporäre Puffer nicht zum Musterpuffer hinzugefügt werden muss. Andernfalls wird eine weitere leere Zeile angezeigt. Führen Sie dann h aus, um das Muster zu ändern Der Cache (der gesamte Inhalt der ersten Zeile zu diesem Zeitpunkt) wird dem temporären Cache hinzugefügt. "$ P" bedeutet, dass die Ausgabe in der letzten Zeile ausgeführt wird, sodass die Ausgabe hier nicht ausgeführt wird.
Führen Sie für die zweite Zeile G aus, um den temporären Cache (nachdem die erste Zeile ausgeführt wurde) zum Mustercache hinzuzufügen. Zu diesem Zeitpunkt wird der Mustercache zu:

It is the last day of 2018.
This is a test file.

Führen Sie dann h aus, um den obigen Mustercache zu kopieren und den vorherigen temporären Cache zu überschreiben. Zu diesem Zeitpunkt wird der temporäre Cache auch zu:

It is the last day of 2018.
This is a test file.

Führen Sie dann die folgenden anderen Zeilen nacheinander aus.
. . .
Drucken Sie in der letzten Zeile den Inhalt im temporären Puffer aus und vervollständigen Sie die retrograde Ausgabe eines Textes!
Es gibt mehr Operationen im sed-Cache, aber einige sind schwer zu verstehen.

===== DAS ENDE ====

Referenzmaterialien: http://www.grymoire.com/Unix/Sed.html#uh-30

Lerne sed zusammen (vier)

Ich denke du magst

Origin blog.51cto.com/15069450/2577341
Empfohlen
Rangfolge