31+ Beispiele für sed Linux-Befehl in Textmanipulation

Im vorigen Beitrag haben wir über Bash-Funktionen gesprochen und wie man sie direkt von der Kommandozeile aus verwenden kann, und wir haben einige andere coole Sachen gesehen. Heute werden wir über ein praktisches Werkzeug zur String-Manipulation sprechen, das sed oder sed Linux-Befehl heißt.

Wir verwenden sed, um mit Textdateien wie Protokolldateien, Konfigurationsdateien und anderen Textdateien zu arbeiten.

In diesem Beitrag werden wir uns auf den sed Linux-Befehl konzentrieren, der für die Textmanipulation verwendet wird, was ein wesentlicher Schritt auf unserer Bash-Skriptreise ist.

Das Linux-System bietet einige Werkzeuge für die Textverarbeitung; eines dieser Werkzeuge ist sed.

Wir werden über 31 Beispiele mit Bildern besprechen, um die Ausgabe jedes Beispiels zu zeigen.

Inhaltsverzeichnis

Verstehen Sie den sed Linux-Befehl

Der sed-Befehl ist ein nicht-interaktiver Texteditor. Der sed-Linux-Befehl bearbeitet Daten auf der Grundlage der von Ihnen angegebenen Regeln; Sie können ihn wie folgt verwenden:

$ sed options file

Sie sind nicht darauf beschränkt, sed zur Manipulation von Dateien zu verwenden; Sie können ihn wie folgt direkt auf STDIN anwenden:

$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

sed Linux-Befehl

Der s-Befehl ersetzt den ersten Text durch das zweite Textmuster. In diesem Fall haben wir die Zeichenkette „website“ durch das Wort „page“ ersetzt.

Das obige Beispiel war ein einfaches Beispiel zur Demonstration des Tools. Wir können den Linux-Befehl sed auch zum Manipulieren von Dateien verwenden.

Lassen Sie uns eine Beispieldatei erstellen:

sed manipulate file

$ sed 's/test/another test/' ./myfile

Die Ergebnisse werden sofort auf dem Bildschirm ausgegeben; Sie müssen nicht warten, bis die Datei zu Ende verarbeitet ist.

Wenn Ihre Datei groß genug ist, werden Sie das Ergebnis sehen, bevor die Verarbeitung beendet ist.

Der Linux-Befehl aktualisiert Ihre Daten nicht. Er sendet nur den geänderten Text an STDOUT. Die Datei bleibt davon unberührt. Wenn Sie den vorhandenen Inhalt überschreiben möchten, können Sie in unserem vorherigen Beitrag nachsehen, in dem es um Umleitungen ging.

Mehrere sed Linux-Befehle in der Kommandozeile verwenden

Um mehrere sed-Befehle auszuführen, können Sie die Option -e wie folgt verwenden:

$ sed -e 's/This/That/; s/test/another test/' ./myfile

sed mehrere Befehle

Sie müssen sed-Befehle durch ein Semikolon ohne Leerzeichen trennen.

Sie können auch ein einzelnes Anführungszeichen verwenden, um Befehle wie diesen zu trennen:

$ sed -e '> s/This/That/> s/test/another test/' myfile

sed separate commands

Das gleiche Ergebnis, keine große Sache.

Lesen von Befehlen aus einer Datei

Sie können Ihre sed-Befehle in einer Datei speichern und diese verwenden, indem Sie die Datei mit der Option -f angeben.

$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile

Befehle aus Datei lesen

Flags ersetzen

Schauen Sie sich das folgende Beispiel genau an:

$ cat myfile
$ sed 's/test/another test/' myfile

sed substitute flag

Das obige Ergebnis zeigt, dass wir das erste Vorkommen in jeder Zeile ersetzt haben. Um alle Vorkommen eines Musters zu ersetzen, verwenden Sie einen der folgenden Ersetzungsflags.

Wir können die Flags so schreiben:

s/pattern/replacement/flags

Es gibt vier Arten von Ersetzungen:

  • g, alle Vorkommen ersetzen.
  • Eine Zahl, die Nummer des Vorkommens des neuen Textes, den Sie ersetzen möchten.
  • p, den ursprünglichen Inhalt ausgeben.
  • w Datei: bedeutet, die Ergebnisse in eine Datei zu schreiben.

Sie können die Ersetzung einschränken, indem Sie die Nummer des Vorkommens, das ersetzt werden soll, wie folgt angeben:

$ sed 's/test/another test/2' myfile

sed number flag

Wie Sie sehen können, haben wir nur das zweite Vorkommen in jeder Zeile ersetzt.

Das g-Flag bedeutet global, was eine globale Ersetzung für alle Vorkommen bedeutet:

$ sed 's/test/another test/g' myfile

sed global flag

Das p-Flag gibt jede Zeile aus, die eine Musterübereinstimmung enthält, Sie können die Option -n verwenden, um nur die geänderten Zeilen auszugeben.

$ cat myfile
$ sed -n 's/test/another test/p' myfile

sed supress lines

Das w-Flag speichert die Ausgabe in einer angegebenen Datei:

$ sed 's/test/another test/w output' myfile

Ausgabe in Datei senden

Wir geben die Ausgabe auf dem Bildschirm aus, speichern aber die passenden Zeilen in der Ausgabedatei.

Zeichen ersetzen

Angenommen, Sie wollen in der Datei /etc/passwd mit sed nach der bash-Shell suchen und sie durch die csh-Shell ersetzen, dann können Sie das ganz einfach tun:

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

Oh! Das sieht furchtbar aus.

Glücklicherweise gibt es eine andere Möglichkeit, das zu erreichen. Sie können das Ausrufezeichen (!) als String-Begrenzer wie folgt verwenden:

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

Jetzt ist es leichter zu lesen.

Begrenzung von sed

Der sed-Befehl verarbeitet Ihre gesamte Datei. Sie können den sed-Befehl jedoch auf die Verarbeitung bestimmter Zeilen beschränken; es gibt zwei Möglichkeiten:

  • Ein Bereich von Zeilen.
  • Ein Muster, das auf eine bestimmte Zeile passt.

Sie können eine Zahl eingeben, um es auf eine bestimmte Zeile zu beschränken:

$ sed '2s/test/another test/' myfile

sed eingeschränkt

Wir haben nur Zeile zwei geändert.

Wie wäre es, einen Zeilenbereich zu verwenden:

$ sed '2,3s/test/another test/' myfile

Zeilenbereich ersetzen

Auch können wir von einer Zeile bis zum Ende der Datei gehen:

$ sed '2,$s/test/another test/' myfile

Ersetzen bis zum Ende

Oder Sie können ein Muster wie dieses verwenden:

$ sed '/likegeeks/s/bash/csh/' /etc/passwd

sed pattern match

Awesome!!

Sie können reguläre Ausdrücke verwenden, um dieses Muster generischer und nützlicher zu schreiben.

Zeilen löschen

Um Zeilen mit sed zu löschen, können Sie das delete (d)-Flag verwenden, das Ihr Freund ist.

Das delete-Flag löscht den Text aus dem Stream, nicht die Originaldatei.

$ sed '2d' myfile

sed delete line

Hier löschen wir nur die zweite Zeile aus myfile.

Was ist mit dem Löschen eines Bereichs von Zeilen?

$ sed '2,3d' myfile

mehrere Zeilen löschen

Hier löschen wir einen Bereich von Zeilen, die zweite und die dritte.

Eine andere Art von Bereichen:

$ sed '3,$d' myfile

Löschen bis zum Ende

Hier löschen wir ab der dritten Zeile bis zum Ende der Datei.

Alle diese Beispiele verändern niemals die Originaldatei.

$ sed '/test 1/d' myfile

Mustermatch löschen

Hier verwenden wir ein Muster, um die Zeile zu löschen, wenn es in der ersten Zeile übereinstimmt.

Wenn Sie einen Bereich von Zeilen löschen müssen, können Sie zwei Textmuster wie dieses verwenden:

$ sed '/second/,/fourth/d' myfile

Bereich von Zeilen löschen

Wir löschen von der zweiten bis zur vierten Zeile.

Text einfügen und anhängen

Mit den folgenden Flags können Sie Textzeilen einfügen oder anhängen:

  • Das (i) Flag.
  • Das (a)-Flag.
$ echo "Another test" | sed 'i\First test '

Text einfügen

Wir haben den Text vor der angegebenen Zeile hinzugefügt.

$ echo "Another test" | sed 'a\First test '

sed append

Wir haben den Text nach der angegebenen Zeile hinzugefügt.

Nun, was ist mit dem Hinzufügen von Text in der Mitte?

Einfach, schauen Sie sich das folgende Beispiel an:

$ sed '2i\This is the inserted line.' myfile

sed insert line

Und das Anhängen funktioniert genauso, aber schauen Sie sich die Position des angehängten Textes an:

$ sed '2a\This is the appended line.' myfile

sed append line

Wir verwenden die gleichen Flags, aber mit einer Position des Einfügens oder Anhängens.

Zeilen ändern

Um eine bestimmte Zeile zu ändern, können Sie das (c)-Flag wie folgt verwenden:

$ sed '3c\This is a modified line.' myfile

sed modify line

Sie können ein Muster für einen regulären Ausdruck verwenden, und alle Zeilen, die diesem Muster entsprechen, werden geändert.

$ sed '/This is/c Line updated.' myfile

sed pattern match

Zeichen transformieren

Das Transform-Flag (y) funktioniert bei Zeichen wie diesem:

$ sed 'y/123/567/' myfile

sed transform character

Wir wenden die Transformation auf alle Daten an und können sie nicht auf ein bestimmtes Vorkommen beschränken.

Zeilennummern ausgeben

Mit dem (=)-Zeichen können Sie die Zeilennummern wie folgt ausgeben:

$ sed '=' myfile

sed-Zeilennummern

Wenn Sie jedoch -n in Kombination mit dem Gleichheitszeichen verwenden, zeigt der sed-Befehl die Zeilennummer an, die eine Übereinstimmung enthält.

$ sed -n '/test/=' myfile

Zeilen ausblenden

Daten aus einer Datei lesen

Mit dem Flag (r) können Sie Daten aus einer Datei lesen.

Sie können eine Zeilennummer oder ein Textmuster für den zu lesenden Text angeben.

$ cat newfile
$ sed '3r newfile' myfile

Daten aus Datei lesen

Wir haben den Inhalt wie erwartet nach der dritten Zeile eingefügt.

Und das mit einem Textmuster:

$ sed '/test/r newfile' myfile

Lesemuster abgleichen

Cool oder?

Nützliche Beispiele

Angenommen, wir haben eine Datei, die Text mit einem Platzhalter enthält, und wir haben eine andere Datei, die die Daten enthält, die den Platzhalter in der anderen Datei füllen werden.

Wir werden die (r)- und (d)-Flags verwenden, um die Aufgabe zu erledigen.

Das Wort DATA in dieser Datei ist ein Platzhalter für einen echten Inhalt, den wir in einer anderen Datei namens data speichern werden.

Wir werden es durch den tatsächlichen Inhalt ersetzen:

$ Sed '/DATA>/ {r newfiled}' myfile

Platzhalter ersetzen

Wie Sie sehen können, haben wir den Platzhalter mit den Daten aus der anderen Datei gefüllt.

Dies ist nur eine kleine Einführung in den sed-Befehl. Der sed Linux-Befehl ist eine andere Welt für sich.

Die einzige Begrenzung ist Ihre Vorstellungskraft.

Ich hoffe, Sie finden es einfach, Zeichenketten mit dem sed Linux-Befehl zu manipulieren.

Danke.

Gründer von LikeGeeks. Ich bin seit 2010 als Linux-Systemadministrator tätig. Ich bin für die Wartung, Sicherung und Fehlerbehebung von Linux-Servern für mehrere Kunden auf der ganzen Welt verantwortlich. Ich liebe es, Shell- und Python-Skripte zu schreiben, um meine Arbeit zu automatisieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.