Anfängerleitfaden zu Sed [Linux]
Nach grep ist der nächste logische Schritt ein Tutorial zu sed. Der Befehl sed kommt von Stream EDitor, und wie der Name schon sagt, handelt es sich um einen Textfluss. Wenn sed jedoch einer der mächtigsten Befehle in Unix ist, gehört seine Manpage auch zu den rätselhaftesten. Ich werde in diesem Artikel versuchen, die grundlegendste Verwendung von sed zusammenzufassen und Ihnen dann einige Beispiele für fortgeschrittene Skripte zu geben.
Grundlagen
Der allgemeine Befehl für sed ist etwas wie:
sed [option] '{script}' [Textdatei]
Sed führt die von ihm gewünschten Operationen in der Textdatei aus und zeigt das Ergebnis in der Standardausgabe an. Wenn Sie das Ergebnis in einer Textdatei haben möchten, können Sie es entweder über die gewohnte Methode umleiten:
sed [option] '{script}' [Textdatei]> [bearbeitete Textdatei]
Oder verwenden Sie die Option " -i
", die die Eingabedatei direkt bearbeitet:
sed -i [option] '{script}' [Textdatei]
Jetzt fangen wir an, an dem Skript zu arbeiten. Der offensichtlichste erste Schritt ist das Nullskript:
sed '' test.txt
wird nur den Text in test.txt anzeigen.
Eine gute Verwendung von sed ist die Löschung. Lassen Sie uns durch Beispiele üben.
sed '2, 4 d' test.txt
löscht die Zeilen 2 bis 4 von test.txt.
Sie können vermuten, dass die Syntax für das Skript lautet:
sed '[erste zu löschende Zeile] [letzte zu löschende Zeile] d' test.txt
Aber der ausgefallene Teil kommt, wenn Sie reguläre Ausdrücke oder Regex als Delimiter für das Löschen verwenden. Beispielsweise,
sed '/ ^ # / d' test.txt
löscht jede Zeile, die mit "#" beginnt (mit anderen Worten, wenn du Code schreibst, werden alle deine Kommentare gelöscht).
Die allgemeine Syntax ist
sed '/ regex / d' test.txt
zum Löschen der Zeile, die die Regex enthält.
sed '/ regex1 /, / regex2 / d' test.txt
zum Löschen des Intervalls von der Zeile, die regex1 enthält, zu der Zeile, die regex2 enthält.
Das Sonderzeichen "^", das ich im ersten Beispiel verwendet habe, soll den Anfang der Zeile anzeigen.
Dann ist die zweite grundlegende Verwendung, die ich mir vorstellen kann, die Substitution. Die allgemeine Syntax lautet:
sed -re 's / regex1 / regex2 /' test.txt
Sie müssen in der ersten Zeile nach regex1 suchen, sie durch regex2 ersetzen, zur nächsten Zeile wechseln und bis zum Ende des Eingabeflusses wiederholen.
Ein gutes Beispiel ist:
sed -re 's / ^ # * //' test.txt
Es ersetzt das Symbol "#" am Anfang einer Zeile und alle Leerzeichen mit nichts. Mit anderen Worten, die Textdatei wird auskommentiert. Das Symbol "*" ist ein Meta-Zeichen, das hier 0 oder mehr Leerzeichen definiert.
Fortgeschritten
Mit sed kannst du ziemlich schicke Sachen machen, aber du wirst das Limit ziemlich schnell erreichen, wenn du nicht auf sein grundlegendes Verhalten achtest. Sed behandelt den Fluss linear: Er wendet eine Zeile-für-Zeile-Behandlung auf eine Textdatei an. Wenn Sie mehr als eine Änderung an derselben Zeile vornehmen möchten, müssen Sie Etiketten und Mehrfachlinienbehandlung verwenden. All dies kann sehr schnell sehr komplex werden. Ich werde Ihnen jetzt ein paar fortgeschrittene Beispiele zeigen und Ihnen erklären. Wenn Sie mehr wollen, bin ich sicher, dass Sie selbst suchen und die Grundlagen verwenden können, die ich Ihnen gab.
Wenn Sie die leeren Zeilen einer Datei löschen möchten, können Sie den Befehl verwenden
sed -re '/ ^ $ / {N; D} 'test.txt
Das Meta-Zeichen "$" bedeutet das Ende der Zeile, also "^ $" entwirft eine leere Zeile. Dann ist "{N; D}" eine ziemlich komplexe Syntax, um diese Zeile zu löschen.
Wenn Sie jedes Tag in einer HTML-Datei löschen möchten, ist dies der Befehl für Sie:
sed -re ': start s /] *> // g; /Das ": start" wird als Label bezeichnet. Es ist ein bisschen wie ein Tag innerhalb des Skripts, zu dem wir später zurückkehren wollen, um mehrere Änderungen auf eine Zeile anzuwenden. sed sucht nach etwas der Form "" (der Regex] *>) und ersetzt es durch nichts, so dass das erste HTML-Tag der Zeile gelöscht wird. Aber bevor wir zur nächsten Zeile gehen, prüft es, ob etwas anderes mit "<" beginnt, und falls ja, geht es zurück zum Label ": start" und wendet die Behandlung erneut an.
Fazit
Sie sind jetzt bereit, tiefer sed zu studieren, oder verwenden Sie es einfach für einfache Modifikationen. Es ist ein Befehl, den ich in Skripten im Allgemeinen besonders nützlich finde, aber ich brauchte einige Zeit, um seine Syntax zu verstehen. Ich hoffe es wird viel schneller für dich sein.
Kennen Sie einen anderen Grundbefehl für sed? Oder verwenden Sie ein anderes erweitertes Skript mit sed, das Sie teilen möchten? Bitte lassen Sie uns in den Kommentaren wissen.