Wie man Sed in Linux verwendet

Sed ist ein einfaches UNIX-Programm, das keine Dateien erstellt oder bearbeitet. Es ändert nur die Daten, die durch seine Eingabe gelangen, und präsentiert die modifizierten Daten als Ausgabe. Hier geben wir einen kurzen Überblick über die UNIX-Philosophie, gehen durch die Grundlagen der Verwendung von sed und zeigen Ihnen Beispiele, wie Sie das Programm für tägliche Aufgaben nutzen können.
Inhaltsverzeichnis
- Die Grundlagen der Verwendung von Sed
- Auswahl und Kürzen von Textströmen
- Entfernen von Text aus einem Sed-Strom
- Hinzufügen neuer Texte zu einem Sed-Strom
- Finden und Ersetzen von Text in Sed
- Kopieren von Textdaten in den Halteraum
- Verwendung von Labels zur Erstellung von Schleifen in Sed
- Permanente Änderungen in Sed vornehmen
Die Grundlagen der Verwendung von Sed
Sed ist ein Programm, das Textdatenströme lesen und bearbeiten kann. Das bedeutet, dass Sed im Gegensatz zu einem regulären Texteditor keine Dateien auf Ihrem Computer direkt ändert. Stattdessen fungiert es mehr als ein “Filter” für eingehende Daten und ermöglicht es Ihnen, diese nach Belieben zu transformieren.
Um mit Sed zu beginnen, erstellen Sie zunächst eine Datei mit mindestens fünf Zeilen Text darin. Stellen Sie sicher, dass sich ein “neues Zeilen”-Zeichen zwischen Ihren Zeilen befindet:
printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txtHinweis: Während dieser Leitfaden eine mehrzeilige Textdatei verwendet, um Sed zu demonstrieren, funktionieren alle Unterbefehle des Programms auch mit Text, der aus UNIX-Pipes kommt.
Der allgemeine Befehl für Sed sieht ungefähr so aus:
sed[option]'{script}'[Textdatei]Eine der grundlegendsten Funktionen in Sed ist der Unterbefehl n. Er funktioniert, indem er Daten von Seds Eingabe liest und sie in den “Musterraum” Ihres Programms einfügt. Dies ist ein spezieller Puffer, der allen eingehenden Text hält, bevor Sed irgendwelche Manipulationen darauf vornimmt:
sed n hello.txt
Eine weitere grundlegende Funktion von Sed ist der Unterbefehl p. Ähnlich wie n liest er die Daten, die von Seds Eingabe kommen, und platziert sie im Musterraum des Programms. Er gibt sie jedoch auch ausdrücklich in der Ausgabe Ihres Terminals aus.
Die Verwendung des Unterbefehls p kann für Anfänger verwirrend sein, da die Ausführung mit jeder Texteingabe dazu führt, dass Sed seine Ausgabe zweimal ausdruckt. Dies liegt daran, dass Sed standardmäßig seinen Musterraum automatisch druckt, unabhängig davon, ob p vorhanden ist oder nicht:
sed p hello.txt
Um dieses seltsame Verhalten zu deaktivieren, fügen Sie das -n-Flag hinzu, bevor Sie Ihre Sed-Unterbefehle ausführen:
sed-n p hello.txt
Nachdem die Grundlagen geklärt sind, werden die folgenden Abschnitte die verschiedenen Möglichkeiten untersuchen, wie Sie Sed verwenden können, um Textdaten zu manipulieren.
1. Auswahl und Kürzen von Textströmen
Neben dem Drucken können Sie Sed auch verwenden, um Text aus Datenströmen und Dateien auszuwählen und zu kürzen. Der einfachste Weg, dies zu tun, besteht darin, einen Bereichswert zum Unterbefehl p hinzuzufügen.
Der folgende Befehl verwendet Seds Bereichssyntax, um die dritte bis fünfte Zeile in Ihrer Datei “hello.txt” zu drucken:
sed-n'3,5p' hello.txt
Sie können den Unterbefehl p auch verwenden, um nicht zusammenhängende Zeilen in Ihrem Text zu drucken. Zum Beispiel druckt der folgende Befehl die erste und vierte Zeile in der Datei “hello.txt”:
sed-n'1p; 4p' hello.txt2. Entfernen von Text aus einem Sed-Strom
Sed kann auch Daten aus jedem eingehenden Textstrom löschen. Dies ist hilfreich, wenn Sie entweder einige Textzeilen aus einer großen Datei entfernen oder die Ausgabe eines Programms bereinigen möchten, um nur die Informationen anzuzeigen, die Sie benötigen.
Um dies zu tun, verwenden Sie den Unterbefehl d zusammen mit der spezifischen Zeile oder dem Bereich, den Sie löschen möchten:
sed-n'2d; 5d; p' hello.txt
Ähnlich wie beim Drucken von Textzeilen funktioniert der Unterbefehl d auch mit mehrzeiligen Bereichen. Der folgende Befehl löscht beispielsweise die ersten vier Zeilen aus der Datei “hello.txt”:
sed-n'1,4d; p' hello.txtZusätzlich zur Übereinstimmung mit bestimmten Zeilenbereichen können Sie reguläre Ausdrücke verwenden, um den Text zu finden, den Sie löschen möchten. Dadurch informiert Sed darüber, dass nach Zeilen gesucht wird, die das Wort “world” enthalten, und löscht diese:
sed-n'/world/ d; p' hello.txtSie können reguläre Ausdrücke auch als Bereich für Ihre Eingabedatei behandeln. Dies gibt Ihnen mehr Flexibilität bei der Definition Ihrer Auswahlen innerhalb des Programms:
sed-n'/world/,/wonderful/ d; p' hello.txt
3. Hinzufügen neuer Text zu einem Sed-Strom
Neben dem Löschen von Text kann Sed auch neuen Text zu vorhandenen Datenströmen hinzufügen. Obwohl es nicht auf dem Niveau eines vollständigen Texteditors ist, kann diese Funktion dennoch nützlich für einmalige Bearbeitungen und grundlegende Textzusätze sein.
Um eine neue Textzeile hinzuzufügen, führen Sie Sed mit dem Befehl a gefolgt von dem Text aus, den Sie hinzufügen möchten:
sed-ne'$a hello'-e'p' hello.txt
Hinweis: Das -e-Flag sagt Sed, dass der zitierte String danach ein Sed-Ausdruck ist. Dies ermöglicht es Ihnen, mehrere Ausdrücke zu verketten, ohne Sed mehrfach aufzurufen.
Es ist auch möglich, ganze Dateien in einen Sed-Textstrom einzufügen. Verwenden Sie dazu den Befehl r, gefolgt vom Namen der Datei, die Sie hinzufügen möchten:
sed-ne'$r welcome.txt'-e'p' hello.txt
4. Finden und Ersetzen von Text in Sed
Eine der mächtigsten Funktionen von Sed ist die Fähigkeit, Text aus einem Textstrom zu finden und zu ersetzen. Im Gegensatz zum Hinzufügen und Löschen von Text ermöglicht Ihnen dies, Daten dynamisch zu bearbeiten, während sie durch UNIX-Pipes gelangen, was es viel flexibler macht als einen regulären Texteditor.
Beginnen Sie damit, Ihren Texteingang ohne Änderungen von Sed testweise auszudrucken:
sed-ne'p' hello.txt
Ersetzen Sie den Unterbefehl p durch s und fügen Sie dann drei Schrägstriche (/) danach hinzu:
sed-ne's///'-e'p' hello.txtFügen Sie einen strukturellen regulären Ausdruck der Zeichenkette hinzu, die Sie in der ersten und zweiten Schrägstrichlinie abgleichen möchten. Beispielsweise kann ich den folgenden Wert einfügen, um nach Wörtern zu suchen, die mit „wo“ in meinem Eingabestring beginnen:
sed-ne's/wo*.//'-e'p' hello.txtPlatzieren Sie den Textcursor zwischen dem zweiten und dritten Schrägstrich und geben Sie den Text an, mit dem Sie Ihre Übereinstimmungen ersetzen möchten. Im Gegensatz zur vorherigen Spalte verwendet dieser Abschnitt keine strukturellen regulären Ausdrücke:
sed-ne's/wo.*/website/'-e'p' hello.txtStandardmäßig ersetzt Sed nur die erste Zeichenkette, die es auf einer bestimmten Zeile findet. Dies kann ein Problem sein, wenn Sie jede Instanz eines Wortes in Ihrem Textstrom ersetzen möchten. Um dies zu beheben, fügen Sie die g-Option nach dem dritten Schrägstrich Ihres Ausdrucks hinzu:
sed-ne's/wo.*/website/g'-e'p' hello.txt
5. Kopieren von Textdaten in den Halteraum
Sed verwendet zwei Puffer, um Textdaten zu speichern: den Musterraum und den Halteraum. Der erste dient als temporärer Platz für Ihren Text, während er durch Sed-Ausdrücke geht. Der letzte hingegen fungiert als Zwischenablage, in der Sie beliebige Textdaten speichern können.
Ein Vorteil dieses Ansatzes besteht darin, dass Sie es ermöglichen, bestimmte Ausgaben “festzuhalten”, ohne auf externe Programme angewiesen zu sein. Dies kann nützlich sein, wenn Sie planen, Sed zur Verarbeitung von mehrstufigen Textmanipulationen zu verwenden.
Um Halteflächen zu verwenden, stellen Sie zunächst sicher, dass Sie eine Datei mit mindestens einigen Zeilen Text darin haben:
sed-ne'p' hello.txtErsetzen Sie den Unterbefehl p durch h, und geben Sie eine Zeilennummer oder einen Regex-Wert an, den Sed in Ihrer Datei abgleichen wird. Dies sagt Sed, dass es diese spezifische Textzeile übernehmen und in seinen Halteraum kopieren soll:
sed-ne'3h' hello.txtHinweis: Die Daten in einem Halteraum bleiben bei verschiedenen Sed-Befehlen nicht erhalten.
Sie können auch den Unterbefehl H verwenden, um mehrere Zeilen Text in Ihrem Halteraum zu speichern. Beispielsweise speichert der folgende Befehl die dritte und vierte Zeile meiner Textdatei und gibt sie im Terminal aus:
sed-ne'3,4H; $ {x; p}' hello.txt
6. Verwendung von Labels zur Erstellung von Schleifen in Sed
Obwohl Sed keine umfassende Programmiersprache ist, ist es dennoch möglich, Schleifen im Programm zu erstellen. Dies ist nützlich, wenn Sie einen Sed-Ausdruck haben, der kontinuierlich über einen bestimmten Teil des Texteingangs laufen muss.
Um eine Schleife in Sed zu erstellen, müssen Sie zunächst ein Label für Ihren Sed-Ausdruck erstellen. Dazu verwenden Sie den Unterbefehl : gefolgt von dem Label, das Sie für Ihren Ausdruck verwenden möchten.
sed-e':x' hello.txtGeben Sie die Matching-Kriterien für Ihren Sed-Ausdruck an. In meinem Fall möchte ich, dass es ans Ende jeder Zeile in meinem Eingabetext geht:
sed-e':x; $' hello.txtGeben Sie die Sed-Unterbefehle ein, die Sie ausführen möchten, wenn Sed eine Übereinstimmung findet, und schließen Sie sie in geschweifte Klammern ein. Folgendes verbindet zwei benachbarte Zeilen, ersetzt das neue Zeilenzeichen durch ein Leerzeichen und geht zurück zum Anfang des Ausdrucks:
sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt
Sie können dies sogar erweitern, um fast jeden Textinput abzugleichen. Beispielsweise verwendet der folgende Befehl Seds erweiterte Regex-Funktion, um HTML-Tags aus Ihrem Eingabetext zu entfernen:
sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html
7. Permanente Änderungen in Sed vornehmen
Wie bei jedem anderen UNIX-Tool kann Sed von der Ausgabenumleitung und Pipes profitieren. Dies ermöglicht es Ihnen nicht nur, Sed mit anderen Programmen zu verknüpfen, sondern gibt Ihnen auch die Möglichkeit, Ihre Änderungen dauerhaft zu machen.
Die folgende Codezeile erstellt eine neue Datei “welcome.txt” aus der Ausgabe meines Sed-Befehls:
sed-ne'2p; 6p' hello.txt > hi.txt
Neben der Ausgabenumleitung können Sie auch das integrierte -i-Flag verwenden, um Ihre aktuelle Datei zu bearbeiten, anstatt Ihre Änderungen in Ihrem Terminal-Konsole auszugeben. Beispielsweise entfernt der folgende Befehl alle Zeilenumbrüche aus meiner Textdatei und speichert sie:
sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt
Wenn Sie all dies neugierig auf die Linux-Befehlszeile gemacht hat, können Sie unseren früheren Artikel lesen, in dem wir über einige der interessantesten Bash-Prompts sprechen, die Sie heute verwenden können.
Bildnachweis: Morgan Richardson über Unsplash. Alle Änderungen und Screenshots von Ramces Red.