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

Vollständiger Sed-Befehlsleitfaden [Erklärt mit praktischen Beispielen]

In einem früheren Artikel habe ich die grundlegende Verwendung von Sed, dem Stream-Editor, anhand eines praktischen Anwendungsfalls gezeigt. Bereiten Sie sich heute darauf vor, mehr Einblicke in Sed zu gewinnen, da wir eine ausführliche Tour durch das Sed-Ausführungsmodell machen werden.

Dies wird auch eine Gelegenheit sein, alle Sed-Befehle ausführlich zu überprüfen und in ihre Details und Feinheiten einzutauchen.

Also, wenn Sie bereit sind, starten Sie ein Terminal, laden Sie die Testdateien herunter und setzen Sie sich bequem vor Ihre Tastatur:Wir werden unsere Erkundung sofort beginnen!

Ein bisschen Theorie zu Sed

Ein erster Blick auf das sed-Ausführungsmodell

Um Sed wirklich zu verstehen, müssen Sie zuerst das Werkzeugausführungsmodell verstehen.

Bei der Verarbeitung von Daten liest Sed jeweils eine Eingabezeile und speichert sie im sogenannten Musterbereich . Alle Transformationen von Sed gelten für den Musterraum. Transformationen werden durch Ein-Buchstaben-Befehle beschrieben, die auf der Befehlszeile oder in einer externen Sed-Skriptdatei bereitgestellt werden. Den meisten Sed-Befehlen kann eine Adresse oder ein Adressbereich vorangestellt werden, um ihren Geltungsbereich einzuschränken.

Standardmäßig druckt Sed den Inhalt des Musterbereichs am Ende jedes Verarbeitungszyklus, d. h. kurz bevor der Musterbereich mit der nächsten Eingabezeile überschrieben wird. Wir können dieses Modell wie folgt zusammenfassen:

  1. Versuchen Sie, die nächste Eingabezeile in den Musterbereich einzulesen

Wenn das Lesen erfolgreich war:

  1. Wende in der Skriptreihenfolge alle Befehle an, deren Adresse mit der aktuellen Eingabezeile übereinstimmt
  2. Falls sed nicht im stillen Modus gestartet wurde (-n ) den Inhalt des (möglicherweise modifizierten) Musterbereichs ausgeben
  3. zurück zu 1.

Da der Inhalt des Musterraums nach Verarbeitung jeder Zeile verloren geht, ist er nicht für eine Langzeitspeicherung geeignet. Zu diesem Zweck hat Sed einen zweiten Puffer, den hold space . Sed löscht, stellt oder ruft niemals Daten aus dem Haltebereich ab, es sei denn, Sie fordern dies ausdrücklich an. Wir werden dies später genauer untersuchen, wenn wir den Austausch, die Befehle erhalten und halten, untersuchen.

Die abstrakte Sed-Maschine

Das oben erläuterte Modell wird in vielen Sed-Tutorials beschrieben. Tatsächlich ist es korrekt genug, um die grundlegendsten Sed-Programme zu verstehen. Aber wenn Sie sich mit fortgeschritteneren Befehlen befassen, werden Sie feststellen, dass dies nicht ausreicht. Versuchen wir also, jetzt etwas formeller zu sein.

Tatsächlich kann Sed als Implementierung einer abstrakten Maschine betrachtet werden, deren Zustand durch drei Puffer, zwei Register und zwei Flags definiert wird:

  • drei Puffer um Text beliebiger Länge zu speichern. Ja:drei ! Im grundlegenden Ausführungsmodell haben wir über den Muster- und Haltebereich gesprochen, aber Sed hat einen dritten Puffer:die Append-Warteschlange . Aus der Sed-Skript-Perspektive ist es ein Nur-Schreiben-Puffer, den Sed automatisch zu vordefinierten Zeitpunkten seiner Ausführung leert (im Großen und Ganzen bevor eine neue Zeile aus der Eingabe gelesen wird oder kurz bevor es beendet wird).
  • Sed unterhält auch zwei Register :der Zeilenzähler (LC), das die Anzahl der von der Eingabe gelesenen Zeilen enthält, und den Programmzähler (PC), die immer den Index („Position“ im Skript) des nächsten auszuführenden Befehls enthalten. Sed inkrementiert den PC automatisch als Teil seiner Hauptschleife. Aber mit bestimmten Befehlen kann ein Skript den PC auch direkt so modifizieren, dass er Teile des Programms überspringt oder wiederholt. So lassen sich Schleifen oder bedingte Anweisungen mit Sed realisieren. Mehr dazu im Abschnitt über spezielle Branches weiter unten.
  • Zum Schluss zwei Flaggen kann das Verhalten bestimmter Sed-Befehle ändern:das Auto-Print-Flag (AP) das Substitutions-Flag (SF). Wenn das Auto-Print-Flag gesetzt ist , druckt Sed automatisch den Inhalt des Musterbereichs vorher Überschreiben (insbesondere vor dem Lesen einer neuen Eingabezeile, aber nicht nur). Wenn das Auto-Print-Flag leer ist („nicht gesetzt“), wird Sed niemals den Inhalt des Musterbereichs ohne einen expliziten Befehl im Skript drucken. Sie können das Auto-Print-Flag löschen, indem Sie Sed im „stillen Modus“ ausführen (mithilfe von -n Befehlszeilenoption oder mit dem speziellen Kommentar #n in der allerersten Zeile oder im Skript). Das „Ersetzungs-Flag“ wird durch den Ersetzungsbefehl gesetzt (die s Befehl), wenn sowohl seine Adresse als auch sein Suchmuster mit dem Inhalt des Musterbereichs übereinstimmen. Das Substitutions-Flag wird zu Beginn jedes neuen Zyklus gelöscht oder wenn eine neue Zeile von der Eingabe gelesen wird oder nachdem eine bedingte Verzweigung genommen wurde. Auch hier werden wir dieses Thema noch einmal im Detail im Zweigbereich behandeln.

Darüber hinaus verwaltet Sed die Liste der Befehle, die ihren Adressbereich eingegeben haben (mehr dazu im Abschnitt Bereichsadressen), sowie einige Dateihandles zum Lesen und Schreiben von Daten. Weitere Informationen dazu finden Sie in der Beschreibung der Lese- und Schreibbefehle.

Lesen Sie die ganze Geschichte

Der Rest des Artikels ist nur für LHB Pro-Mitglieder verfügbar. Sie können sich jetzt für 50 $ pro Jahr anmelden, um den Rest dieses Artikels zu lesen und KOSTENLOSEN Zugriff auf alle Beiträge, E-Books und Videokurse nur für Mitglieder zu erhalten.

AbonnierenSie haben bereits ein Konto?Melden Sie sich an
Linux
  1. Lassen Sie sich mit sort in der Befehlszeile sortieren

  2. Bearbeiten von Text auf der Kommandozeile mit sed

  3. Multitasking auf der Kommandozeile mit Screenie

  4. Konvertieren Sie die Zeichenfolge in der Befehlszeile in Hexadezimal

  5. sed Zeile mit Leerzeichen in eine bestimmte Zeile einfügen

So überprüfen Sie die Betriebssystemversion mit der Linux-Befehlszeile

Die 50 praktischen Beispiele des SED-Befehls in Linux

Wait-Befehl in Linux mit praktischen Beispielen erklärt

So verwenden Sie den leistungsstarken Xargs-Befehl unter Linux [Erklärt mit Beispielen]

Verwendung des Linux-Befehls sed mit Beispielen

Unix Sed Tutorial:Mehrzeilige Dateioperation mit 6 praktischen Beispielen