Advertisements

So verwenden Sie den Linux-Befehl sed

Nur wenige Unix-Befehle sind so berühmt wie sed, grep und awk. Sie werden oft gruppiert, möglicherweise weil sie seltsame Namen und leistungsstarke Tools zum Analysieren von Text haben. Sie haben auch einige syntaktische und logische Ähnlichkeiten. Und obwohl sie alle zum Analysieren von Text nützlich sind, hat jede ihre Besonderheiten. Dieser Artikel untersucht die sed Befehl, der a . ist Stream-Editor.

Ich habe bereits über sed geschrieben, sowie über seinen entfernten Verwandten ed. Um sich mit sed vertraut zu machen, ist es hilfreich, sich mit ed vertraut zu machen, denn das hilft Ihnen, sich an die Idee von Puffern zu gewöhnen. In diesem Artikel wird davon ausgegangen, dass Sie mit den Grundlagen von sed vertraut sind, dh Sie haben zumindest den Klassiker ausgeführt s/foo/bar/ style-Befehl zum Suchen und Ersetzen.

[Download our free sed cheat sheet]

sed installieren

Weitere Linux-Ressourcen

Wenn Sie Linux, BSD oder macOS verwenden, haben Sie bereits GNU oder BSD sed installiert. Dies sind einzigartige Neuimplementierungen des Originals sed Befehl, und obwohl sie ähnlich sind, gibt es kleine Unterschiede. Dieser Artikel wurde auf den Linux- und NetBSD-Versionen getestet, daher können Sie in diesem Fall jede sed verwenden, die Sie auf Ihrem Computer finden, obwohl Sie für BSD-sed kurze Optionen verwenden müssen (-n anstatt --quiet, zum Beispiel) nur.

GNU sed wird allgemein als das funktionsreichste verfügbare sed angesehen, also sollten Sie es vielleicht ausprobieren, egal ob Sie Linux verwenden oder nicht. Wenn Sie GNU sed (auf Nicht-Linux-Systemen oft als gsed bezeichnet) in Ihrem Ports-Baum nicht finden können, können Sie den Quellcode von der GNU-Website herunterladen. Das Schöne an der Installation von GNU sed ist, dass Sie seine zusätzlichen Funktionen verwenden können, es aber auch auf die POSIX-Spezifikationen von sed beschränken können, falls Sie Portabilität benötigen.

MacOS-Benutzer können GNU sed auf MacPorts oder Homebrew finden.

Unter Windows können Sie GNU sed mit Chocolatey installieren.

Musterraum verstehen und Raum halten

Sed arbeitet immer nur in einer Zeile. Da es keine visuelle Anzeige hat, erstellt es ein Musterraum, ein Speicherplatz im Speicher, der die aktuelle Zeile aus dem Eingabestream enthält (wobei alle nachfolgenden Zeilenumbrüche entfernt wurden). Sobald Sie den Musterbereich gefüllt haben, führt sed Ihre Anweisungen aus. Wenn das Ende der Befehle erreicht ist, gibt sed den Inhalt des Musterbereichs in den Ausgabestrom aus. Der Standardausgabestream ist stdout, aber die Ausgabe kann mit dem in eine Datei oder sogar zurück in dieselbe Datei umgeleitet werden --in-place=.bak Möglichkeit.

Dann beginnt der Zyklus wieder mit der nächsten Eingabezeile.

Um ein wenig Flexibilität beim Durchsuchen von Dateien mit sed zu bieten, bietet sed auch eine Platz halten (manchmal auch als a . bezeichnet Puffer halten), ein Platz im Speicher von sed, der für die temporäre Datenspeicherung reserviert ist. Sie können sich Speicherplatz wie eine Zwischenablage vorstellen, und tatsächlich zeigt dieser Artikel genau das: wie Sie mit sed kopieren/ausschneiden und einfügen.

Erstellen Sie zunächst eine Beispieltextdatei mit diesem Text als Inhalt:

Line one
Line three
Line two

Kopieren von Daten, um Platz zu halten

Um etwas in den Laderaum von sed zu legen, verwenden Sie die h oder H Befehl. Ein Kleinbuchstabe h weist sed an, den aktuellen Inhalt des Halteraums zu überschreiben, während ein Großbuchstabe H weist es an, Daten an alles anzuhängen, was sich bereits im Haltebereich befindet.

Allein verwendet gibt es nicht viel zu sehen:

$ sed --quiet -e '/three/ h' example.txt
$

Der --quiet (-n kurz) unterdrückt alle Ausgaben außer dem, was sed für meine Suchanforderungen geleistet hat. In diesem Fall wählt sed eine beliebige Zeile aus, die die Zeichenfolge enthält three, und kopieren Sie es, um Platz zu halten. Ich habe sed nicht angewiesen, etwas zu drucken, daher wird keine Ausgabe erstellt.

Kopieren von Daten aus dem Wartebereich

Um einen Einblick in den Wartebereich zu erhalten, können Sie seinen Inhalt aus dem Wartebereich kopieren und ihn mit dem im Musterbereich platzieren g Befehl. Beobachten Sie, was passiert:

$ sed -n -e '/three/h' -e 'g;p' example.txt

Line three
Line three

Die erste leere Zeile wird gedruckt, weil der Haltebereich leer ist, wenn er zum ersten Mal in den Musterbereich kopiert wird.

Die nächsten beiden Zeilen enthalten Line three denn das ist, was ab Zeile zwei im Laderaum ist.

Dieser Befehl verwendet zwei einzigartige Skripte (-e) dient lediglich der Lesbarkeit und Organisation. Es kann sinnvoll sein, Schritte in einzelne Skripte aufzuteilen, aber technisch funktioniert dieser Befehl genauso gut wie eine Skriptanweisung:

$ sed -n -e '/three/h ; g ; p' example.txt

Line three
Line three

Anhängen von Daten an den Musterbereich

Der G -Befehl fügt ein Newline-Zeichen und den Inhalt des Haltebereichs an den Musterbereich an.

$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one

Line three
Line three
Line two
Line three

Die ersten beiden Zeilen dieser Ausgabe enthalten sowohl den Inhalt des Musterraums (Line one) und den leeren Laderaum. Die nächsten beiden Zeilen entsprechen dem Suchtext (three), enthält also sowohl den Musterraum als auch den Halteraum. Der Halteraum ändert sich für das dritte Zeilenpaar nicht, also der Musterraum (Line two) druckt mit dem Halteraum (noch Line three) am Ende nachlaufend.

Ausschneiden und Einfügen mit sed

Da Sie nun wissen, wie Sie eine Zeichenfolge von Muster zu Leerzeichen und wieder zurück jonglieren, können Sie ein sed-Skript entwickeln, das eine Zeile kopiert, dann löscht und dann in ein Dokument einfügt. Die Beispieldatei für diesen Artikel hat beispielsweise Line three außer Betrieb. Sed kann das beheben:

$ sed -n -e '/three/ h' -e '/three/ d'
-e '/two/ G;p' example.txt
Line one
Line two
Line three
  • Das erste Skript findet eine Zeile mit der Zeichenfolge three und kopiert es vom Musterbereich in den Haltebereich und ersetzt alles, was sich derzeit im Haltebereich befindet.
  • Das zweite Skript löscht jede Zeile mit der Zeichenfolge three. Dies vervollständigt das Äquivalent von a schneiden Aktion in einem Textverarbeitungs- oder Texteditor.
  • Das letzte Skript findet eine Zeile mit two und anhängt den Inhalt des Haltebereichs in den Musterbereich und druckt dann den Musterbereich.

Job erledigt.

Scripting mit sed

Auch hier dient die Verwendung separater Skriptanweisungen ausschließlich der visuellen und mentalen Einfachheit. Der Befehl zum Ausschneiden und Einfügen funktioniert als ein Skript:

$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three

Es kann sogar als dedizierte Skriptdatei geschrieben werden:

#!/usr/bin/sed -nf

/three/h
/three/d
/two/ G
p

Um das Skript auszuführen, markieren Sie es als ausführbar und probieren Sie es in Ihrer Beispieldatei aus:

$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three

Je vorhersehbarer der zu analysierende Text ist, desto einfacher ist es natürlich, Ihr Problem mit sed zu lösen. Es ist normalerweise nicht praktikabel, “Rezepte” für sed-Aktionen (wie Kopieren und Einfügen) zu erfinden, da die Bedingung zum Auslösen der Aktion wahrscheinlich von Datei zu Datei unterschiedlich ist. Je flüssiger Sie jedoch die Befehle von sed beherrschen, desto einfacher ist es, komplexe Aktionen basierend auf den zu analysierenden Eingaben zu entwickeln.

Die wichtigen Dinge sind das Erkennen verschiedener Aktionen, das Verstehen, wann sed zur nächsten Zeile wechselt, und die Vorhersage, was das Muster und der Halteraum enthalten können.

Laden Sie den Spickzettel herunter

Sed ist komplex. Es hat nur ein Dutzend Befehle, aber seine flexible Syntax und rohe Kraft bedeuten, dass es voller endloser Möglichkeiten steckt. Ich habe immer auf Seiten mit cleveren Einzeilern verwiesen, um das Beste aus sed herauszuholen, aber erst als ich anfing, meine eigenen Lösungen zu erfinden (und manchmal neu zu erfinden), hatte ich das Gefühl, dass ich damit anfing eigentlich lernen sed. Wenn Sie nach sanften Erinnerungen an Befehle und hilfreichen Tipps zur Syntax suchen, laden Sie unseren Sed-Spickzettel herunter und beginnen Sie ein für alle Mal, Sed zu lernen!

So verwenden Sie den Linux-Befehl sed

Leave a Reply

Your email address will not be published. Required fields are marked *

Scroll to top