logo

Sed-Befehl unter Linux/Unix mit Beispielen

Der Linux-Befehl „sed“ steht für Stream Editor. Es wird verwendet, um Streams (Dateien) mithilfe regulärer Ausdrücke zu bearbeiten. Diese Bearbeitung ist jedoch nicht dauerhaft. Es bleibt nur in der Anzeige, aber in Wirklichkeit bleibt der Dateiinhalt derselbe.

Es wird hauptsächlich zur Textersetzung verwendet; Darüber hinaus kann es für andere Textbearbeitungsvorgänge wie Einfügen, Löschen, Suchen und mehr verwendet werden. Mit dem Befehl sed können wir Dateien bearbeiten, ohne sie zu öffnen. Die Unterstützung regulärer Ausdrücke macht es zu einem leistungsfähigeren Textbearbeitungstool.

Übersicht über den sed-Befehl

Es handelt sich um ein Unix-Dienstprogramm, das Text mit einer kompakten und einfachen Programmiersprache umwandelt und analysiert. Es wurde von 1973 bis 1974 von Lee E. McMahon von Bell Labs integriert und ist heute für fast jedes Betriebssystem vorhanden. Der Befehl sed basierte auf den Skriptaspekten des früheren qed (Schnelleditor) und des interaktiven Editors ed. Es war das früheste Tool zur Unterstützung regulärer Ausdrücke und bleibt für die Textverarbeitung aktiv, vor allem mit dem Substitutionsbefehl. Berühmte alternative Tools sind Perl und AWK für „Stream-Bearbeitung“ und Klartext-String-Manipulation.

Betriebsmodus des sed-Befehls

Der Befehl sed ist ein zeilenorientiertes Dienstprogramm zur Textverarbeitung: Er liest Zeile für Zeile Text aus einer Datei oder einem Eingabestream in einen internen Puffer, den sogenannten Musterraum. Alle Zeilenlesevorgänge beginnen einen Zyklus. Der sed-Befehl verwendet eine oder mehrere Operationen, die durch ein sed-Skript für den Musterraum beschrieben wurden. Es betreibt eine Programmiersprache mit etwa 25 Befehlen, die die Vorgänge im Text beschreiben.

Für alle Eingabezeilen führt der Befehl sed normalerweise zum Musterbereich und beginnt den Zyklus nach der Ausführung des Skripts erneut mit der nächsten Zeile. Andere Skriptende-Arten sind über Skriptbefehle und Set-Optionen verfügbar, z. B. N, um die nächste Zeile sofort in den Musterraum aufzunehmen, q, um zu beenden, d, um den Musterraum zu entfernen, und so weiter. Daher bezieht sich ein Sed-Skript auf einen Schleifenkörper, der von einer Streamline aus iteriert, in der die Schleifenvariable und die Schleife selbst von sed verwaltet und implizit werden.

  • Ein Sed-Skript kann entweder in der Befehlszeile beschrieben oder über eine isolierte Datei gelesen werden. Im sed-Skript können Befehle im Zusammenhang mit regulären Ausdrücken oder Zeilennummern eine zusätzliche Adresse annehmen. Die Adresse entscheidet, wann der Befehl ausgeführt wird. Beispielsweise führt 2d den Befehl d (oder delete) nur in der zweiten Eingabezeile aus, während /^ /d jede Zeile entfernt, die mit einem Leerzeichen beginnt.
  • Der Haltebereich, ein isolierter spezieller Puffer, kann von einigen sed-Befehlen zum Halten eines sich ansammelnden Textes zwischen Zyklen verwendet werden. Die Befehlssprache von sed verfügt nur über zwei Variablen (Musterraum und Halteraum) und eine GOTO-ähnliche Verzweigungsfunktionalität. Allerdings ist die Sprache Turing-vollständig. Esoterische SED-Skripte sind für verschiedene Spiele wie Tetris, Schach, Arkanoid und Sokoban verfügbar.
  • Die Hauptschleife wird für alle Zeilen des Eingabestreams ausgeführt und überprüft das sed-Skript in allen Zeilen der Eingabe. Die sed-Skriptzeilen sind alle ein Muster-Aktions-Paar, das darstellt, welches Muster abgeglichen werden soll und welche Aktion implementiert werden soll, die als bedingte Anweisung kopiert werden kann. Die Standardaktionen (Musterbereich drucken, Zeile in den Musterbereich kopieren), Eingabe- und Ausgabeströme und Arbeitsvariablen (Speicherbereich halten und Musterbereich) sind implizit; Aufgrund der Hauptschleife ist es möglich, knappe Einzeilerprogramme anzugeben.

Verwendung des sed-Befehls

    Ersatzbefehl
    Das folgende Beispiel stellt den Befehl und die typischste Verwendung des Befehls sed dar, d. h. die Ersetzung. Die Verwendung war die eigentliche Motivation für den sed-Befehl:
    sed 's/regexp/replacement/g' Eingabedateiname > AusgabedateinameAndere Befehle von sed
    Für die einfache Verarbeitung sind mit rund 25 sed-Befehlen auch andere Wege möglich. Im Folgenden wird beispielsweise die Option d zum Herausfiltern von Zeilen verwendet, die nur Leerzeichen und das Zeilenendezeichen enthalten:
    sed '/^ *$/d' inputFileName
    Das obige Beispiel verwendet einige der folgenden Metazeichen für reguläre Ausdrücke:
    • Das Caretzeichen (^) entspricht dem Zeilenanfang.
    • Das Dollarsymbol ($) entspricht dem Abschluss der Zeile.
    • Das Sternchen (*) entspricht dem Vorkommen mehrerer oder null vorheriger Zeichen.
    • Das Pluszeichen (+) entspricht dem Vorkommen eines oder mehrerer vorheriger Zeichen.
    • Das Fragezeichen (?) ist dasselbe wie das Vorkommen von mehr oder keinem vorherigen Zeichen.
    • Das Punktsymbol (.) entspricht genau einem Zeichen.
    als Filter eingesetzt
    Häufig wird der Befehl sed als Filter innerhalb einer Pipeline unter Unix verwendet:
    $generateData | sed 's/x/y/g'
    Das Programm „generateData“ generiert Daten und der Befehl „sed“ nimmt eine kleine Änderung vor, indem er x anstelle von y einsetzt.Dateibasierte Sed-Skripte
    Oft ist es hilfreich, viele sed-Befehle, einen einzelnen Befehl pro Zeile, in eine Skriptdatei einzufügen und das Flag -f zu verwenden, um die Befehle aus der Datei auszuführen:
    sed -f subst.sed Eingabedateiname > Ausgabedateiname

Syntax:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Optionen:

Im Folgenden sind einige Befehlszeilenoptionen des Befehls sed aufgeführt:

-n, --quiet, --silent: Es ermöglicht uns mit Nachdruck, den Musterraum zu drucken.

-e Skript, --expression=Skript: Es wird verwendet, um das Skript zu den auszuführenden Befehlen hinzuzufügen.

-f Skriptdatei, --file=Skriptdatei: Es wird verwendet, um den Inhalt der Skriptdatei zu den auszuführenden Befehlen hinzuzufügen.

--follow-symlinks: Es wird verwendet, um Symlinks bei der Verarbeitung vor Ort zu folgen.

-i[SUFFIX], --in-place[=SUFFIX]: Es wird verwendet, um Dateien direkt zu bearbeiten (erstellt ein Backup, wenn die Option SUFFIX angegeben ist).

-l N, --line-length=N: Es wird verwendet, um die gewünschte Zeilenumbruchlänge für den Befehl „l“ anzugeben.

--posix: Es wird verwendet, um alle GNU-Erweiterungen zu deaktivieren.

-E, -r, --regexp-extended: Es ermöglicht uns, die erweiterten regulären Ausdrücke im Skript zu verwenden (für Portabilität verwenden Sie POSIX -E).

-s, --separate: Es wird verwendet, um Dateien als getrennt und nicht als einzeln zu betrachten, und setzt den langen Stream fort.

--Sandkasten: Es wird für den Betrieb im Sandbox-Modus verwendet.

-u, --unbuffered: Es wird zum Laden minimaler Datenmengen aus den Eingabedateien verwendet und leert die Ausgabepuffer häufiger.

-z, --null-data: Es wird verwendet, um Zeilen durch NUL-Zeichen zu trennen.

--helfen: Es wird verwendet, um das Hilfehandbuch anzuzeigen.

--Ausführung: Es dient zur Anzeige von Versionsinformationen.

Beispiele für den sed-Befehl

Sehen wir uns die folgenden Beispiele an:

Anwenden auf das STDIN-Verzeichnis

Der Befehl sed ist nicht nur auf die Bearbeitung von Dateien beschränkt; Wir können es auch auf das STDIN-Verzeichnis anwenden.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Die obigen Befehle ersetzen den ersten Text durch das zweite Textmuster. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Aus der obigen Ausgabe haben wir zunächst den Befehl „sed“ für eine Zeichenfolge „class7“ ausgeführt, wobei „class“ in „jtp“ und 7 in 10 geändert wurde. Anschließend haben wir den Befehl „sed“ für einen Stream „msg.txt“ ausgeführt ' wobei „lernen“ in „studieren“ umgewandelt wird.

Globaler Ersatz

Im vorherigen Beispiel wurden nicht alle „lernen“-Wörter in „studieren“ umgewandelt. Um jedes Wort zu bearbeiten, müssen wir einen globalen Ersatz „g“ verwenden. Es werden alle angegebenen Wörter in einer Datei oder Zeichenfolge bearbeitet.

rr-Algorithmus

Syntax:

 command | sed 's///g' 

Betrachten Sie die folgenden Beispiele:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Die oben genannten Befehle ersetzen alle angegebenen Textmuster. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Aus der obigen Ausgabe, indem Sie den Befehl „echo class7 class9 |“ ausführen sed 's/class/jtp/g'' die gesamte 'class' wird in 'jtp' konvertiert und mit dem Befehl 'cat msg.txt | sed 's/learn/study/g'' das ganze 'learn' wurde in 'study' umgewandelt.

Eine Zeile entfernen

Mit der Option „d“ können wir eine komplette Zeile aus einer Datei entfernen. Wir müssen nur ein Wort aus dieser Zeile mit der Option „d“ angeben, und diese Zeile wird gelöscht. Beachten Sie jedoch, dass alle Zeilen mit demselben Wort gelöscht werden. Es wird wie folgt ausgeführt:

 cat | sed '//d' 

Betrachten Sie den folgenden Befehl:

 cat msg.txt | sed '/jtp/d' 

Der obige Befehl löscht die Zeilen mit dem Wort „jtp“. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Aus der obigen Ausgabe, indem Sie den Befehl „cat msg.txt |“ ausführen sed '/jtp/d'' alle Zeilen, die das Wort 'jtp' enthalten, werden gelöscht.

Binäre Suche

Verwenden des Befehls „Multiple sed“.

Mit der Option „-e“ können wir mehrere sed-Befehle gleichzeitig ausführen. Wir können mehr als eine sed-Operation ausführen, indem wir den Befehl wie folgt ausführen:

 sed -e ' ; ' 

Betrachten Sie den folgenden Befehl:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Der obige Befehl wendet alle angegebenen Vorgänge in der Datei „exm.txt“ an. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Wie wir der obigen Ausgabe entnehmen können, werden alle „roten“ Wörter durch „blau“ und alle „gelben“ Wörter durch „schwarz“ ersetzt. Wir können Befehle auch wie folgt trennen:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Das Ergebnis ist das gleiche wie beim obigen Befehl.

Befehle aus einer Datei lesen

Wir können die sed-Befehle in einer Datei speichern und sie sofort in jeder Datei anwenden. Dies kann durch Angabe der Option „-f“ wie folgt erfolgen:

 sed -f 

Aus dem obigen Befehl geht hervor, dass '' eine Datei mit einer SED-Befehlsliste ist. Betrachten Sie den folgenden Befehl:

 sed -f SedCommands exm.txt 

Der obige Befehl wendet alle angegebenen Befehle in der Datei „SedCommand“ auf „exm.txt“ an. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Aus der obigen Ausgabe haben wir Befehle verwendet, die auf das frühere Beispiel angewendet wurden. Die Ausgabe ist also dieselbe wie im vorherigen Beispiel.

Zeichen ersetzen

Wir können das Ausrufezeichen (!) als Zeichenfolgentrennzeichen verwenden. Zum Beispiel möchten wir die Bash-Shell ersetzen und sie durch die CSH-Shell in „/etc/passwd“ ersetzen. Führen Sie dazu den folgenden Befehl aus:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Wir können das gleiche Ergebnis erzielen, indem wir den folgenden Befehl ausführen:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Begrenzung des Sed

Die grundlegende Verwendung des Befehls sed verarbeitet die gesamte Datei. Wir können den Befehl sed jedoch einschränken und eine beliebige Zeile angeben. Es gibt zwei Möglichkeiten, den sed-Befehl einzuschränken:

  • Eine Reihe von Zeilen.
  • Ein Muster, das einer bestimmten Zeile entspricht.

Wir können eine Zahl angeben, um eine Zeile wie folgt anzugeben:

 sed '3s/Red/Blue/' exm.txt 

Der obige Befehl wendet die angegebene Operation in der dritten Zeile an. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Von der obigen Ausgabe wird nur die dritte Zeile geändert.

Wir können auch einen Zeilenbereich angeben. Um einen Zeilenbereich anzugeben, führen Sie den Befehl wie folgt aus:

 sed '1,3s/Red/Blue/' exm.txt 

Der obige Befehl aktualisiert den angegebenen Text in den Zeilen 1 und 3. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Text einfügen und anhängen

Die Flags „i“ und „a“ werden zum Einfügen und Anhängen des Textes in eine Datei verwendet. Das Flag „i“ fügt den Text vor der Zeichenfolge hinzu, und das Flag „a“ wird verwendet, um Text nach der Zeichenfolge hinzuzufügen. Betrachten Sie den folgenden Befehl:

 echo 'Another Demo' | sed 'iFirst Demo' 

Der obige Befehl fügt den Text vor dem Text „Another Demo“ ein. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Um Text anzuhängen, führen Sie den Befehl wie folgt aus:

 echo 'Another Demo' | sed 'aFirst Demo' 

Der obige Befehl hängt den Text an. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Modifizieren von Linien

Das Flag „c“ wird zum Ändern einer bestimmten Zeile verwendet. Um eine Zeile zu ändern, führen Sie den Befehl wie folgt aus:

 sed '3cThis is a modified line.' exm.txt 

Der obige Befehl aktualisiert die dritte Zeile. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Wir können auch einen regulären Ausdruck verwenden, um mehr als eine Zeile mit demselben Muster zu aktualisieren. Betrachten Sie den folgenden Befehl:

 sed '/Apple is /c Line updated.' exm.txt 

Der obige Befehl aktualisiert alle Zeilen mit der Zeichenfolge „Apple is“. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Transformation von Charakteren

Das Flag „y“ wird zur Transformation der Zeichen verwendet. Die Transformation von Charakteren kann nicht auf bestimmte Vorkommnisse beschränkt werden. Um Zeichen umzuwandeln, führen Sie den Befehl wie folgt aus:

 sed 'y/abc/def/' exm.txt 

Der obige Befehl wandelt die Zeichen „a“, „b“, „c“ in „d“, „e“, „f“ um. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Drucken der Zeilennummern

Das Zeichen „=“ wird zum Drucken der Zeilennummer verwendet. Um die Zeilennummer auszudrucken, führen Sie den Befehl wie folgt aus:

 sed '=' exm.txt 

Der obige Befehl zeigt die Zeilennummer des Dateiinhalts an. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Das Gleichheitszeichen mit der Option „-n“ gibt die Zeilennummer an, die ein passendes Skript enthält. Betrachten Sie die folgende Ausgabe:

 sed -n '/mango/=' exm.txt 

Der obige Befehl zeigt die Zeilennummer an, die das Wort „Mango“ enthält. Betrachten Sie die folgende Ausgabe:

Linux Sed-Filter

Aus der obigen Ausgabe können wir ersehen, dass Zeile Nummer 2 das Wort „Mango“ enthält.