Dieser Artikel ist Teil der fortlaufenden Serie Unix Sed Tipps und Tricks.
In unseren vorherigen sed-Artikeln haben wir Folgendes gelernt:sed-Drucken, sed-Löschen, sed-Ersatz, sed-Datei schreiben, sed-Mehrfachbefehle, sed-Mehrzeilenoperation und sed-Manipulieren von Dateizeilen.
In unserem ersten Teil des sed-Tutorials haben wir gelernt, dass sed zwei Puffer hat – sed pattern buffer und sed hold buffer . Bisher haben wir nur über Musterpuffer gesprochen.
In diesem Artikel sehen wir uns anhand von 7 praktischen Sed-Beispielen an, wie man sed hold und pattern buffer verwendet .
Wie der Name schon sagt, sed hold buffer wird verwendet, um den gesamten oder einen Teil des sed-Musterraums zu speichern zum späteren Abrufen. Der Inhalt des Musterbereichs kann in den Haltebereich kopiert werden und dann wieder zurück. Auf dem Haltebereich werden keine Operationen direkt durchgeführt. sed bietet eine Reihe von Hold- und Get-Funktionen, um diese Bewegungen zu handhaben.
Sed-h-Funktion
Die Funktion h (hold) kopiert den Inhalt des Musterbereichs in einen Haltebereich (auch als sed hold space bezeichnet). ), wodurch alle vorherigen Inhalte des Haltebereichs zerstört werden.
Sed H-Funktion
Die H-Funktion hängt den Inhalt des Musterraums an den Inhalt des Haltebereichs an. Der bisherige und der neue Inhalt werden durch einen Zeilenumbruch getrennt.
Sed g-Funktion
Die g-Funktion kopiert den Inhalt des Haltebereichs in den Musterbereich und zerstört den vorherigen Inhalt des Musterbereichs.
Sed G-Funktion
Die G-Funktion hängt den Inhalt des Haltebereichs an den Inhalt des Musterraums an. Der bisherige und der neue Inhalt werden durch einen Zeilenumbruch getrennt. Die maximale Anzahl von Adressen ist zwei.
Sed x-Funktion
Die Austauschfunktion tauscht die Inhalte des Musterraums und des Haltebereichs aus. Die maximale Anzahl von Adressen ist zwei.
Sehen wir uns nun einige Beispiele an, um mehr über die obigen Befehle zu erfahren.
Lassen Sie uns zuerst die Datei thegeekstuff.txt erstellen, die in den unten erwähnten Beispielen verwendet wird.
$ cat thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures
1. Dateiinhalt mit doppeltem Leerzeichen unter Verwendung des Sed-Befehls
$sed 'G' thegeekstuff.txt #Linux Administration Scripting Tips and Tricks #Windows Administration #Database Mysql Oracle Queries Procedures $
In diesem Beispiel
- Sed liest eine Zeile und legt sie in den Musterpuffer.
- Der G-Befehl fügt den Haltepuffer an den Musterpuffer an, getrennt durch \n. also wird ein Zeilenumbruch an den Inhalt des Musterbereichs angehängt.
- Ähnlich, wenn Sie eine Datei mit dreifachem Leerzeichen versehen möchten, hängen Sie den Inhalt des Haltepuffers zweimal an den Musterpuffer an. (G;G)
2. Dateiinhalt in umgekehrter Reihenfolge mit dem Sed-Befehl drucken
Gibt die Zeilen einer Datei in umgekehrter Reihenfolge aus (ähnlich dem zuvor besprochenen tac-Befehl).
$sed -n '1!G;h;$p' thegeekstuff.txt Procedures Queries Oracle Mysql #Database Administration #Windows Tips and Tricks Scripting Administration #Linux
In diesem Beispiel
- Die erste Zeile wird so wie sie ist in den Haltebereich gestellt.
- Hängen Sie ab der 2. Zeile einfach den Inhalt des Haltebereichs mit dem Musterbereich an. (Denken Sie daran, dass sich die zweite Zeile im Musterbereich und die erste Zeile im Haltebereich befindet).
- Jetzt wurden die 1. und 2. Zeile vertauscht und verschieben Sie dies in den Haltebereich.
- Wiederholen Sie die obigen Schritte bis zur letzten Zeile.
- Sobald die letzte Zeile erreicht ist, hängen Sie einfach den Inhalt des Haltebereichs mit dem Musterbereich an und geben Sie den Musterbereich aus.
3. Drucken Sie einen Absatz (nur wenn er ein bestimmtes Muster enthält) mit dem Sed-Befehl
In thegeekstuff.txt Absatz nur drucken, wenn er das Muster „Administration“ enthält.
$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration
In diesem Beispiel
- Bis die leere Zeile kommt, fügen Sie die nicht leeren Zeilen weiter in den Haltebereich ein
- Wenn eine leere Zeile kommt, d. h. ein Absatz endet, tauschen Sie die Daten zwischen Muster und Leerzeichen aus. Damit der gesamte Absatz im Musterbereich verfügbar ist.
Prüfen Sie, ob das Muster „Verwaltung“ verfügbar ist. Wenn ja, löschen Sie es nicht, d. h. drucken Sie den Musterbereich
4. Drucken Sie die Zeile unmittelbar vor einer Musterübereinstimmung mit dem Sed-Befehl
Drucken Sie nur die Zeile unmittelbar davor, das Muster „Mysql“.
$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt #Database
In diesem Beispiel
- Lege die Zeile für jeden Zyklus in den Haltepuffer, wenn sie nicht mit dem Muster „Mysql“ übereinstimmt.
- Wenn die Zeile mit dem Muster übereinstimmt, holen Sie sich die Daten aus dem Haltebereich (vorherige Zeile) mit dem Befehl g und drucken Sie sie aus.
- Falls die erste Zeile mit dem Muster „Mysql“ übereinstimmt, bleibt trotzdem das Leerzeichen leer. (Es gibt keine vorherige Zeile zur ersten Zeile). Daher sollte die erste Zeile nicht gedruckt werden (1!p)
5. Löschen Sie die letzte Zeile jedes Absatzes mit dem Sed-Befehl
$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt #Linux Administration Scripting #Windows #Database Mysql Oracle Queries
In diesem Beispiel
- Wenn die Zeile nicht leer ist, dann tauschen Sie die Zeile zwischen Muster und Leerzeichen aus. Die erste Zeile wird also in den Haltebereich gestellt.
- Wenn die nächste nicht leere Zeile kommt, tauschen Sie den Musterbereich und den Haltebereich aus und drucken Sie den Musterbereich. d.h. die erste nicht leere Zeile wird gedruckt und die zweite Zeile wird gehalten. Und im nächsten Zyklus wird die 2. nicht leere Zeile gedruckt, wenn die 3. Zeile hält und so weitergeht.
- Wenn eine leere Zeile kommt (die vorherige Zeile der leeren Zeile wird im Haltepuffer verfügbar sein), tauschen Sie einfach Muster und Halteraum aus und löschen Sie die Zeile (letzte Zeile des Absatzes) und starten Sie den nächsten Zyklus.
6. Hängen Sie für jede Zeile die vorherige Zeile mit dem Sed-Befehl
an ihr Ende an$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt #Linux Administration#Linux Scripting Administration Tips and Tricks Scripting Tips and Tricks #Windows Administration#Windows Administration #Database Mysql#Database Oracle Mysql Queries Oracle Procedures Queries
In diesem Beispiel
- Legen Sie die erste Zeile in den Haltepuffer.
- Wenn die zweite Zeile kommt, fügen Sie Leerzeichen an Hold (erste Zeile) an
- Dann Muster austauschen und Puffer halten. Jetzt hat Musterraum also eine erste und zweite Zeile, die durch \n getrennt sind, Halteraum hat nur eine zweite Zeile.
- Vertausche also die Linien im Musterbereich.
- Die obigen Schritte werden bis zum Ende der Datei ausgeführt
7. Tag jedes Blocks jeder Zeile dieses Blocks voranstellen
$ sed ' /^#/{ h d } G s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt Linux Administration Linux Scripting Linux Tips and Tricks Linux Windows Administration Windows Database Mysql Database Oracle Database Queries Database Procedures
In diesem Beispiel
- Wenn die erste Zeile eines Blocks erreicht wird (beginnend mit #)
- Behalten Sie diese Zeile mit dem Befehl `h’ im Hold Space
- Löschen Sie dann mit „d“, um einen weiteren Zyklus zu starten.
- Für die restlichen Zeilen eines Blocks fügt der Befehl „G“ die Tag-Zeile vom Hold Space an und ersetzt den Befehl, der Tag und Zeilen ordnungsgemäß vertauscht.