GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Unix Sed Tutorial:7 Beispiele für Sed Hold und Pattern Buffer Operationen

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

  1. Sed liest eine Zeile und legt sie in den Musterpuffer.
  2. 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.
  3. Ä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

  1. Die erste Zeile wird so wie sie ist in den Haltebereich gestellt.
  2. 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).
  3. Jetzt wurden die 1. und 2. Zeile vertauscht und verschieben Sie dies in den Haltebereich.
  4. Wiederholen Sie die obigen Schritte bis zur letzten Zeile.
  5. 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

  1. Bis die leere Zeile kommt, fügen Sie die nicht leeren Zeilen weiter in den Haltebereich ein
  2. 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

  1. Lege die Zeile für jeden Zyklus in den Haltepuffer, wenn sie nicht mit dem Muster „Mysql“ übereinstimmt.
  2. 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.
  3. 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

  1. 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.
  2. 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.
  3. 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

  1. Legen Sie die erste Zeile in den Haltepuffer.
  2. Wenn die zweite Zeile kommt, fügen Sie Leerzeichen an Hold (erste Zeile) an
  3. 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.
  4. Vertausche also die Linien im Musterbereich.
  5. 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

  1. 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.
  2. 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.

Linux
  1. Bash For Loop Guide und Beispiele

  2. Linux ln Command Tutorial für Anfänger (5 Beispiele)

  3. Linux nl Command Tutorial für Anfänger (7 Beispiele)

  4. Beispiele für Bash-For- und While-Schleifen

  5. Das Konzept von 'Hold space' und 'Pattern space' in sed

Unix Sed Tutorial:Drucken von Dateizeilen mit Adresse und Mustern

Unix Sed Tutorial:Löschen Sie Dateizeilen mit Adresse und Mustern

Unix-Sed-Tutorial:Fortgeschrittene Sed-Ersetzungsbeispiele

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

Unix-Sed-Tutorial:6 Beispiele für Sed-Verzweigungsoperationen

Unix Sed Tutorial:Mehrzeilige Dateioperation mit 6 praktischen Beispielen