Zurück zum Blog

Eine Übersicht über den Sed Stream Editor zur Textbearbeitung in Linux

Eine Übersicht über den Sed Stream Editor zur Textbearbeitung in Linux

Der Befehl sed ist eine Abkürzung für Stream-Editor. Es ist ein sehr beliebtes Werkzeug auf Linux/UNIX-Systemen. Sed ist an sich kein Texteditor. Es kann jedoch verschiedene Modifikationen vornehmen, um einen bestimmten Text zu manipulieren. Die Texteingabe wird als Stream gesendet. Sed führt dann die angewiesenen Aktionen auf dem Stream aus. Diese Anleitung gibt einen Überblick über den sed-Befehl und wie man ihn bedient, um Text in Linux erfolgreich zu manipulieren.

Sed in Linux

Der Eingabestream von sed kann entweder aus einer Textdatei oder von STDIN (Standardeingabe) stammen. Wir können mit der Ausgabe eines anderen Befehls arbeiten oder direkt mit einer Textdatei arbeiten. Das sed -Werkzeug ist auf allen Linux-Distributionen vorinstalliert.

Sed-Nutzungsübersicht

Der sed -Befehl folgt der folgenden Struktur:

Zu Demonstrationszwecken haben wir uns die Textversion der GPL-Lizenz Version 3:

Manipulate Text with Sed 7

Der folgende sed -Befehl gibt den Inhalt der Textdatei aus:

Hier führt sed die in den einfachen Anführungszeichen beschriebenen Operationen aus und gibt das Ergebnis aus. Da keine Option definiert ist, sed einfach eine leere Operation ausführen und den gesamten Inhalt der Datei ausgeben.

Sed akzeptiert auch die Ausgabe eines anderen Befehls als Eingabestream. Im nächsten Beispiel leiten Sie den Inhalt der GPL v3-Textdatei per Pipe an sed weiter, um eine leere Operation auszuführen:

Zeilen ausgeben

Ohne Angabe einer Option gibt sed den gesamten Inhalt der Datei direkt aus. Stattdessen können wir explizit den Ausgabebefehl senden, um die Ergebnisse direkt auf der Standardausgabe (STDOUT) auszugeben.

Um die Ausgabe auszugeben, verwenden Sie das Zeichen p:

Manipulate Text with Sed 6

Standardmäßig gibt sed die Ausgabe auf dem Bildschirm aus. Da wir speziell den Ausgabebefehl verwendet haben, sed jede Zeile zweimal ausgeben. Sed arbeitet zeilenweise. Es liest eine Zeile, führt bestimmte Operationen aus, gibt sie aus und geht zur nächsten Zeile über.

Wie wir sehen können, wird jede Zeile zweimal ausgegeben. Wenn das Ergebnis so verwirrend ist, können wir es mit der Option -n bereinigen. Sie unterdrückt die automatische Ausgabefunktion. Da wir den Ausgabebefehl senden, müssen wir die Standard-Ausgabefunktion nicht aktivieren:

Regex-Zeichenklassen

In regulären Ausdrücken gibt es verschiedene Zeichenklassen. Jede dieser Klassen hat einen Bereich. Viele Klassen haben auch mehrere Ausdrücke. Die meisten Klassen sind Zeichenbereiche:

    • [a-z]: Kleinbuchstabe
    • [A-Z]: Großbuchstabe
    • [0-9]: Ziffern
    • [a-zA-z]: Alphabet
    • [a-zA-z0-9]: Beliebiges alphanumerisches Zeichen

Diese Zeichenklassen haben auch unterschiedliche Schreibweisen:

    • [:lower:]: Kleinbuchstabe
    • [:upper:]: Großbuchstabe
    • [:digit:]: Ziffern
    • [:alpha:]: Alphabet
    • [:alphanum:]: Alphanumerisches Zeichen

Der folgende Befehl gibt beispielsweise alle Zeilen aus, die mindestens eine Ziffer enthalten:

Manipulate Text with Sed 3

Adressbereiche

Wir können den spezifischen Teil des Textstreams angeben, mit dem gearbeitet werden soll. Dies kann die statische Position einer Zeile oder ein Bereich von Zeilen sein. Im ersten Beispiel geben wir Zeile 5 aus der GPL v3-Textdatei aus:

$ sed -n

Anstelle einer einzelnen Zeile können wir auch einen Bereich von Zeilen angeben, mit dem gearbeitet werden soll. Hier haben wir den Adressbereich von Zeile 5 bis Zeile 9 (insgesamt 5 Zeilen) angegeben, auf dem sed arbeiten wird:

gpl-3.0.txt

Es gibt auch verschiedene Möglichkeiten, die Zeilenadresse anzugeben. Anstatt die Zeilennummern selbst zu bestimmen, können wir das vorherige Beispiel so umgestalten, dass sed bei Zeile 5 beginnt und auf den nächsten 5 Zeilen arbeitet:

5,+5p

Eine andere Möglichkeit, Zeilen anzugeben, ist die Verwendung von Intervallen. Im nächsten Beispiel beginnt sed bei Zeile 1 und arbeitet auf jeder zweiten Zeile:

Text löschen

Bisher haben wir daran gearbeitet, Zieltextzeilen auszugeben. Anstatt sie auszugeben, können wir die Zeilen aus der Ausgabe entfernen. Im folgenden Beispiel werden wir mehrere Zeilen vom Anfang entfernen. Hier müssen wir die Option nicht verwenden -n weil wir möchten, dass sed alles andere ausgibt, was nicht gelöscht wurde. Für das Löschen von Zeilen verwenden wir die Option d:

Manipulate Text with Sed 2

Beachten Sie, dass die Quelldatei weiterhin intakt ist. Sed führt das Löschen der Zeilen nur während der Ausgabe durch. Wenn Sie möchten, können Sie die Ausgabe von sed in einer Datei speichern. Sie können die Originaldatei überschreiben oder unter einem anderen Namen speichern:

Anstatt die Ausgabe manuell in eine Datei zu schreiben, kann sed eine direkte Bearbeitung der Originaldatei durchführen. Kurz gesagt, sed wird die Originaldatei bearbeiten und alle vorgenommenen Änderungen schreiben. Diese Methode überschreibt die Originaldatei und sollte daher mit Vorsicht angewendet werden:

Da die direkte Bearbeitung gefährlich ist, verfügt sed über eine Backup-Funktion. Verwenden Sie bei direkten Bearbeitungen -i.bak anstelle von -i, um vor dem Bearbeiten ein Backup zu erstellen. Sed erstellt die Backup-Datei mit der Dateiendung .bak :

Textersetzung

Dies ist mit Abstand eine der häufigsten Anwendungen von sed. Es sucht nach einem Textmuster und ersetzt dieses durch einen bestimmten Text. Hierbei wird das Textmuster in regulären Ausdrücken (kurz Regex) beschrieben. Um mehr über die Verwendung von Regex zu erfahren, folgen Sie diesem Tutorial, das beschreibt, wie Sie Grep mit Regex verwenden, um nach Textmustern zu suchen in Dateien.

Hier ist ein Beispiel für die einfachste Textersetzung mittels Regex:

Hier ist s der Befehl für die Ersetzung. Die Schrägstriche dienen als Trennzeichen für das Muster und den Ersatz. Setzen wir es in die Praxis um:

Manipulate Text with Sed 5

Das nächste Beispiel demonstriert die Verwendung des Unterstrichs (_). Hier dienen die Unterstriche als Trennzeichen:

Hier suchen wir nach com/index, um es durch net/home. zu ersetzen. Beachten Sie die Platzierung der Unterstriche, da diese sehr wichtig ist. Wenn beispielsweise der letzte Unterstrich fehlt, wird sed wird einen Fehler ausgeben:

Wir benötigen eine Beispieldatei, um das Ersetzen zu üben. Hier habe ich eine gekürzte Version der GPL-v3-Textdatei:

Führen wir einige grundlegende Textersetzungen durch:

Sehen Sie sich das nächste Beispiel an. Wir möchten alle Vorkommen von the in THE :

$ echo

Fällt Ihnen etwas auf? Sed hat nicht alle Vorkommen von the. geändert. Tatsächlich ist es nur das erste Vorkommen. Was ist da los? Dies ist das Standardverhalten der Option s. Sie gleicht nur das erste Vorkommen in einer bestimmten Zeile ab und springt zur nächsten. Um sicherzustellen, dass sed die gesamte Zeile nach dem Suchmuster durchsucht, müssen wir ein optionales Flag g verwenden. Korrigieren wir den Befehl:

Jetzt funktioniert es wie gewünscht. Eine weitere interessante Möglichkeit zur Verwendung des Befehls besteht darin, die Anzahl der zu ändernden Vorkommen anzugeben. Im vorherigen Beispiel gab es 3 Vorkommen von the, richtig? Wie wäre es, wenn wir festlegen, dass nur das 3. Vorkommen geändert wird? Die Änderung erfolgt beim optionalen Flag:

Wenn Sie mit einer großen Textdatei arbeiten, kann es hilfreich sein, wenn sed nur die Zeilen ausgibt, in denen die Ersetzungen stattgefunden haben. Um das zu erreichen, müssen wir ein weiteres zusätzliches Flag hinzufügen: p:

Manipulate Text with Sed 4

Groß-/Kleinschreibung

Standardmäßig sind alle sed -Operationen case-sensitive. Der folgende Befehl demonstriert das Standardverhalten bezüglich der Groß-/Kleinschreibung:

$ echo "HELLO WORLD"

Aufgrund der unterschiedlichen Groß-/Kleinschreibung gibt es keine Änderung. In einer solchen Situation können wir sed anweisen, die Groß-/Kleinschreibung zu ignorieren. Fügen Sie dazu das optionale Flag i:

Wie man Texte ersetzt und referenziert

Die Stärke von sed liegt hauptsächlich in der Fähigkeit, reguläre Ausdrücke zu verwenden. Mit fortgeschritteneren und komplexeren Regex-Mustern können wir noch viel mehr erreichen. Beispielsweise können wir Text vom Anfang einer Datei bis zu einer bestimmten Stelle ersetzen. Werfen Sie einen Blick auf den folgenden Ausdruck:

Hier steht das Caret-Zeichen (^) für den Zeilenanfang. Der Operator für ein beliebiges Zeichen wird durch einen Punkt dargestellt: (.). Das Sternchen (*) ist der Wildcard-Ausdruck, der vom Anfang der Zeile bis zu GNU.

Ein weiterer interessanter Trick ist die Verwendung des &-Symbols. Wir können es verwenden, um die Bereiche hervorzuheben, in denen sed das Suchmuster findet:

Manipulate Text with Sed

Fazit

In diesem Tutorial haben wir die Grundlagen des sed -Befehls kennengelernt. Wir haben gelernt, wie man bestimmte Zeilen ausgibt, Texte sucht, Texte löscht und ersetzt, Texte überschreibt und reguläre Ausdrücke verwendet. Ein richtig konstruierter sed-Befehl kann ein Textdokument dramatisch verändern. Sie können nun erfolgreich Text in Linux manipulieren mit der Hilfe von sed.

Viel Spaß beim Computing!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev ist ein kreativer Designer bei CloudSigma und konzentriert sich auf eine konsistente Unternehmensidentität durch traditionelle und innovative Marketingkanäle. Er versteht es meisterhaft, künstlerische Vision mit strategischem Marketing zu verbinden, um wirkungsvolle Markengeschichten zu schaffen.

Kommentare

Noch keine Kommentare. Schreiben Sie den ersten.