GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verwenden Sie den Linux-Befehl sed

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

Ich habe bereits über sed und seinen entfernten Verwandten ed geschrieben. 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. Dieser Artikel geht davon aus, dass Sie mit den Grundlagen von sed vertraut sind, was bedeutet, dass Sie zumindest das klassische s/foo/bar/ ausgeführt haben style Suchen-und-Ersetzen-Befehl.

[Laden Sie unseren kostenlosen Sed-Spickzettel herunter]

Installation von sed

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Wenn Sie Linux, BSD oder macOS verwenden, haben Sie bereits GNU oder BSD sed installiert. Dies sind einzigartige Neuimplementierungen des ursprünglichen 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 statt --quiet , zum Beispiel) nur.

GNU sed wird allgemein als das funktionsreichste verfügbare sed angesehen, also sollten Sie es vielleicht ausprobieren, ob Sie Linux verwenden oder nicht. Wenn Sie GNU sed (auf Nicht-Linux-Systemen oft als gsed bezeichnet) nicht in Ihrem Ports-Baum finden, 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 nutzen, aber auch einschränken können, dass es den POSIX-Spezifikationen von sed entspricht, falls Sie Portabilität benötigen.

MacOS-Benutzer finden GNU sed auf MacPorts oder Homebrew.

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

Musterraum und Halteraum verstehen

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

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

Um beim Durchsuchen von Dateien mit sed ein wenig Flexibilität zu bieten, bietet sed auch einen Speicherplatz (manchmal auch als Haltepuffer bezeichnet ), ein Speicherplatz im Speicher von sed, der für die temporäre Datenspeicherung reserviert ist. Sie können sich Holdspace wie eine Zwischenablage vorstellen, und genau das demonstriert dieser Artikel:wie man mit sed kopiert/ausschneidet und einfügt.

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

Line one
Line three
Line two

Kopieren von Daten in den Haltebereich

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

Einzeln verwendet, gibt es nicht viel zu sehen:

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

Der --quiet (-n kurz) Option unterdrückt alle Ausgaben, aber was sed für meine Suchanforderungen durchgeführt hat. In diesem Fall wählt sed eine beliebige Zeile aus, die die Zeichenfolge three enthält , und kopieren Sie es, um Platz zu halten. Ich habe sed nicht angewiesen, irgendetwas zu drucken, also wird keine Ausgabe erzeugt.

Kopieren von Daten aus dem Holdspace

Um einen Einblick in den Haltebereich zu erhalten, können Sie seinen Inhalt aus dem Haltebereich kopieren und ihn mit g in den Musterbereich einfügen 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, da 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 Haltebereich ist.

Dieser Befehl verwendet zwei eindeutige Skripte (-e ) nur zur Unterstützung der Lesbarkeit und Organisation. Es kann nützlich sein, Schritte in einzelne Skripte zu unterteilen, aber technisch gesehen 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

Das G Der Befehl fügt ein Zeilenvorschubzeichen 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 Musterbereichs (Line one ) und den leeren Laderaum. Die nächsten beiden Zeilen entsprechen dem Suchtext (three ), enthält also sowohl den Musterbereich als auch den Haltebereich. Der Halteabstand ändert sich für das dritte Zeilenpaar nicht, sodass der Musterabstand (Line two ) druckt mit dem Hold-Leerzeichen (immer noch Line three ) am Ende nachgestellt.

Ausschneiden und Einfügen mit sed

Da Sie nun wissen, wie Sie mit einer Zeichenfolge zwischen Muster und Leerzeichen jonglieren und wieder zurück, können Sie ein sed-Skript entwickeln, das eine Zeile in einem Dokument kopiert, dann löscht und dann wieder einfügt. Die Beispieldatei für diesen Artikel enthält 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, die den String three enthält und kopiert es aus dem Musterbereich in den Haltebereich und ersetzt alles, was sich derzeit im Haltebereich befindet.
  • Das zweite Skript löscht jede Zeile, die die Zeichenfolge three enthält . Dies vervollständigt das Äquivalent eines Schnitts Aktion in einem Textverarbeitungsprogramm oder Texteditor.
  • Das letzte Skript findet eine Zeile, die two enthält und anhängt den Inhalt von hold space in pattern space und druckt dann den pattern space.

Arbeit erledigt.

Skripterstellung mit sed

Auch hier dient die Verwendung separater Skriptanweisungen lediglich der visuellen und mentalen Einfachheit. Der Befehl zum Ausschneiden und Einfügen funktioniert wie 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 testen Sie es mit Ihrer Beispieldatei:

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

Je vorhersehbarer der Text ist, den Sie parsen müssen, desto einfacher ist es natürlich, Ihr Problem mit sed zu lösen. Es ist normalerweise nicht praktisch, "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 mit den Befehlen von sed umgehen, desto einfacher ist es, komplexe Aktionen basierend auf den Eingaben zu entwickeln, die Sie parsen müssen.

Die wichtigen Dinge sind das Erkennen unterschiedlicher Aktionen, das Verstehen, wann sed zur nächsten Zeile wechselt, und das Vorhersagen, was das Muster und der Halteraum voraussichtlich enthalten werden.

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 endlosem Potenzial ist. Früher habe ich auf Seiten mit cleveren Einzeilern verwiesen, um s optimal zu nutzen, aber erst als ich anfing, meine eigenen Lösungen zu erfinden (und manchmal neu zu erfinden), hatte ich das Gefühl, dass ich anfing zu eigentlich lernen. Wenn Sie nach sanften Erinnerungen an Befehle und hilfreichen Tipps zur Syntax suchen, laden Sie unseren sed-Spickzettel herunter und lernen Sie sed ein für alle Mal!


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. So verwenden Sie den Verlaufsbefehl unter Linux

  3. So verwenden Sie den Su-Befehl unter Linux

  4. So verwenden Sie den id-Befehl unter Linux

  5. So verwenden Sie den Befehl „screen“ unter Linux

So verwenden Sie den Linux-Ping-Befehl

So verwenden Sie den fd-Befehl auf einem Linux-System

Wie verwende ich den wget-Befehl unter Linux?

Wie verwende ich den xargs-Befehl unter Linux?

So verwenden Sie den RPM-Befehl unter Linux

So verwenden Sie den which-Befehl in Linux