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/'
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 '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
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
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
Flags ersetzen
Schauen Sie sich das folgende Beispiel genau an:
$ cat myfile
$ sed 's/test/another test/' myfile
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
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
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
Das w-Flag speichert die Ausgabe in einer angegebenen Datei:
$ sed 's/test/another test/w output' myfile
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
Wir haben nur Zeile zwei geändert.
Wie wäre es, einen Zeilenbereich zu verwenden:
$ sed '2,3s/test/another test/' myfile
Auch können wir von einer Zeile bis zum Ende der Datei gehen:
$ sed '2,$s/test/another test/' myfile
Oder Sie können ein Muster wie dieses verwenden:
$ sed '/likegeeks/s/bash/csh/' /etc/passwd
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
Hier löschen wir nur die zweite Zeile aus myfile.
Was ist mit dem Löschen eines Bereichs von Zeilen?
$ sed '2,3d' myfile
Hier löschen wir einen Bereich von Zeilen, die zweite und die dritte.
Eine andere Art von Bereichen:
$ sed '3,$d' myfile
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
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
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 '
Wir haben den Text vor der angegebenen Zeile hinzugefügt.
$ echo "Another test" | sed 'a\First test '
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
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
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
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
Zeichen transformieren
Das Transform-Flag (y) funktioniert bei Zeichen wie diesem:
$ sed 'y/123/567/' myfile
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
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
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
Wir haben den Inhalt wie erwartet nach der dritten Zeile eingefügt.
Und das mit einem Textmuster:
$ sed '/test/r newfile' myfile
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
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.