Was ist sed und wofür wird es angewendet?

20

Ich habe in sedletzter Zeit viel gesehen und finde es ein ziemlich verwirrender Befehl. Die Hilfeseiten waren nicht besonders hilfreich, aber ich weiß, dass sie zum Parsen der Ausgabe anderer Befehle verwendet werden können.

Was genau ist sedund wofür wird es verwendet? Ich bin auf der Suche nach einer umfassenden Antwort, die beschreibt, was sedist, wofür es häufig verwendet wird und einige grundlegende Beispiele / Syntax.

Seth
quelle
3
Aus der Sed-Manpage:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89
Dies sollte ein guter Ort sein, um eine umfassende Antwort zu beginnen: en.wikipedia.org/wiki/Sed
saji89
1
info sedhat viel mehr als man sed. Dann /usr/share/doc/sedist da drin sedfaq.txt.gz.

Antworten:

20

Im Grundgebrauch wird es zum Suchen und Ersetzen durch Zeichenfolgen verwendet.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

kehrt zurück

"The quick brown fox jumps over the lazy cat"

Sed glänzt wirklich, wenn damit reguläre Ausdrücke verwendet werden.

Vielleicht möchten Sie einen Blick auf, diesen Artikel über sedseine recht umfassend.

zurückhaltend
quelle
5

Definitionen

Unix System V: eine praktische Anleitung , Buch von Mark Sobell:

Das Dienstprogramm sed ist ein Batch-Editor (nicht interaktiv). Die sed-Befehle werden normalerweise in einer Skriptdatei gespeichert. . Sie können jedoch einfache sed-Befehle über die Befehlszeile eingeben. . .

Manpage für sed (GNU sed) 4.2.2:

Sed ist ein Stream-Editor. Ein Stream-Editor wird verwendet, um grundlegende Texttransformationen für einen Eingabestream (eine Datei oder eine Eingabe aus einer Pipeline) durchzuführen.

Meine informelle Definition:

Sed(kurz für Stream Editor ) ist ein Textverarbeitungsprogramm, das zu der Zeit entwickelt wurde, als Text zeilenweise verarbeitet wurde, aber eines der leistungsstärksten Unix / Linux-Dienstprogramme bleibt. Gleichzeitig ist es eine Form der Skriptsprache, die speziell für die Textverarbeitung entwickelt wurde.

Verwendet

Wird, wie in den Definitionen angegeben, sedfür die Stapelverarbeitung von Textzeilen, Textdateien und weitergeleiteten Textströmen verwendet. Am häufigsten wird es zum Ersetzen und Löschen von Text verwendet:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Es kann jedoch auch verwendet werden, um das Verhalten anderer Befehle nachzuahmen.

  • zu imitieren dmesg | head -n 3(erste 3 Zeilen drucken), können wir tun dmesg | sed -n 1,3p.
  • zu imitieren dmesg | grep 'wlan0'(nach einer Zeichenfolge suchen), können wir tundmesg | sed -n '/wlan0/p'
  • Listenpunkt

Der große Vorteil sedgegenüber anderen Dienstprogrammen für die Textverarbeitung ist das -iFlag, das bedeutet, dass wir den bearbeiteten Text nicht nur auf dem Bildschirm ausgeben, sondern ihn auch in der Originaldatei speichern können. awkAromen haben dagegen nur eine solche Funktion in der GNU awkVersion.

sedKann Eingaben über die Befehlszeile mit mehreren durch Semikolon ( ;) getrennten Mustern oder aus einer nach -fflag angegebenen Skriptdatei annehmen , zcat someTextfile.txt | sed -f myScript.sed

Sed Anwendungen und Beispiele

Sergiy Kolodyazhnyy
quelle
1

Diese Antwort ist in Bearbeitung. Es fehlen weitere Beispiele zum Befehl susbstitute


Was ist sed?

sed = Stream-Editor

Die Beschreibung auf der Handbuchseite für GNU sed4.2.2-Berichte:

Sed ist ein Stream-Editor. Ein Stream-Editor wird verwendet, um grundlegende Texttransformationen für einen Eingabestream (eine Datei oder eine Eingabe aus einer Pipeline) durchzuführen. Während sed in gewisser Weise einem Editor ähnelt, der geskriptete Bearbeitungen (z. B. ed) zulässt, werden die Eingaben nur einmal durchlaufen und sind folglich effizienter. Es ist jedoch die Fähigkeit von sed, Text in einer Pipeline zu filtern, die ihn besonders von anderen Arten von Editoren unterscheidet.

Die Beschreibung auf der GNU- sedSeite unter gnu.org berichtet:

sed (Streameditor) ist kein interaktiver Texteditor. Stattdessen wird es zum Filtern von Text verwendet, dh, es nimmt Texteingaben vor, führt eine Operation (oder eine Reihe von Operationen) daran durch und gibt den geänderten Text aus. sed wird in der Regel zum Extrahieren eines Teils einer Datei mithilfe von Pattern Matching oder zum Ersetzen mehrerer Vorkommen einer Zeichenfolge in einer Datei verwendet.

Wofür wird es sedangewendet?

Es kann verwendet werden, um komplexe Änderungen an Datenströmen durchzuführen (normalerweise Text, aber es kann auch verwendet werden, um Binärdaten zu ändern).

Zu den häufigsten Anwendungsfällen zählen:

  • Selektives Drucken / Löschen von Zeilen aus einer Textdatei mit einfachen / erweiterten regulären Ausdrücken
  • Ersetzen von Zeichenfolgen in einer Textdatei durch einfache / erweiterte reguläre Ausdrücke
  • Selektives Ersetzen von Zeichenfolgen in einer Textdatei mithilfe einfacher / erweiterter regulärer Ausdrücke

Dies sind die Anwendungsfälle, die in dieser Antwort behandelt werden.

Verwendung

sedLiest die Eingabe aus einer im Dateisystem gespeicherten Datei, wenn während des Aufrufs in den Befehlszeilenargumenten ein Dateiname angegeben wird oder stdinwenn kein Dateiname angegeben wird.

Minimaler Aufruf mit einer im Dateisystem gespeicherten Datei:

sed '' file

Minimaler Aufruf mit stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Hallo Welt!

sedStandardmäßig wird die Eingabedatei zeilenweise gelesen. es liest eine Zeile, entfernt die nachgestellte Zeile und fügt die verarbeitete Zeile in einen "Musterraum" ein; Schließlich werden die aufgeführten Befehle für den aktuellen Inhalt des Musterbereichs ausgeführt und eine neue Zeile aus der Eingabedatei gelesen.

Wenn kein Befehl angegeben ist oder wenn ein poder ein dBefehl angegeben ist *, sedwird immer der aktuelle Inhalt des Musterbereichs gedruckt, gefolgt von einer neuen Zeile bei jeder Iteration, unabhängig davon:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Um dies zu verhindern, kann man sedzusammen mit dem -nSchalter aufrufen :

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Nur für die Rede p, dund sBefehle, die die Befehle in dieser Antwort abgedeckt sind.

Auswahl der Linien

sedkann die gesamte Eingabedatei oder nur ausgewählte Zeilen der Eingabedatei verarbeiten; Die Auswahl der Zeilen der zu verarbeitenden Eingabedatei erfolgt durch Angabe von "Adressen". Eine Adresse kann (unter anderem) entweder eine Zeilennummer oder ein Muster sein. Zeilenbereiche können durch Angabe von Adressbereichen ausgewählt werden.

Mögliche Kombinationen von Adressen sind:

  • <N>(Wo <N>ist eine Zahl?): Der folgende Befehl / die folgenden Befehle werden nur für die Zeilennummer ausgeführt <N>.
  • <N>,<M>(wobei <N>und <M>zwei Zahlen sind, <N>> <M>): der folgende Befehl / die folgenden Befehle werden in Zeilen ausgeführt, die von Zeilennummer <N>bis <M>einschließlich Zeilennummer reichen ;
  • /<pattern>/(wobei <pattern>ein basischer oder erweitern regulärer Ausdruck): Die folgenden Befehl / Befehle werden nur auf den Leitungen durchgeführt werden , das ein Auftreten <pattern>;
  • /<pattern1>/,/<pattern2>/(wobei <pattern1>und <pattern2>sind einfach oder regulären Ausdrücken erweitert): die folgenden Befehls / Befehle auf den Leitungen durchgeführt werden , die von der ersten Zeile ein Auftreten enthält <pattern1>in der nächsten Zeile ein Auftreten enthält <pattern2>geordneten, mehrfach im Fall von mehreren <pattern1>- <pattern2>Vorkommen;
  • <N>,/pattern/(wobei <N>es sich um eine Zahl und <pattern>einen einfachen oder erweiterten regulären Ausdruck handelt): Der folgende Befehl / die folgenden Befehle werden in Zeilen ausgeführt, die von der Zeilennummer <N>bis zur ersten Zeile mit dem Vorkommen von <pattern>;
  • /pattern/,<N>(wobei <pattern>es sich um einen einfachen oder erweiterten regulären Ausdruck und <N>eine Zahl handelt): Der folgende Befehl / die folgenden Befehle werden in Zeilen ausgeführt, die von der ersten Zeile mit einem Vorkommen von <pattern>bis zur Zeilennummer reichen <N>.

Die Auswahl zum Drucken, Löschen oder Ersetzen von Zeilenbereichen umfasst immer die Zeilen, die mit den angegebenen Adressen übereinstimmen. Darüber hinaus ist die Auswahl, die zum Drucken, Löschen oder Ersetzen von Zeilenbereichen mithilfe von Mustern ausgeführt wird, träge und global (dh, jeder betroffene Bereich ist immer so klein wie möglich, und mehrere Bereiche sind betroffen).

Wenn Sie Zeilenbereiche drucken oder nur Zeilen drucken, für die eine Substitution durchgeführt wurde, müssen Sie diese Option sedzusammen mit dem -nSchalter aufrufen , um zu verhindern, dass Zeilen, die mit dem Kriterium übereinstimmen, zweimal gedruckt werden (dies geschieht nur, wenn Zeilenbereiche gedruckt werden) um zu verhindern, dass Zeilen nicht mit dem zu druckenden Kriterium übereinstimmen.

Nach einer Auswahl der zu verarbeitenden Zeilen muss ein Befehl oder mehrere durch Semikolons getrennte Befehle in geschweiften Klammern angegeben werden.

Befehle: Drucken, Löschen

Die Befehle zum Drucken oder Löschen einer Auswahl lauten wie folgt:

  • p: druckt Zeilen, die mit der angegebenen Adresse / dem angegebenen Adressbereich übereinstimmen;
  • d: löscht Zeilen, die mit der angegebenen Adresse / dem angegebenen Adressbereich übereinstimmen;

Wenn einem dieser Befehle keine Adresse / Auswahl vorangestellt ist, wird der Befehl global ausgeführt, dh in jeder Zeile der Eingabedatei.

Beispiele: Drucken, Löschen

Zeilen mit numerischen Adressen drucken / löschen:

Beispieldatei:

line1
line2
line3
line4
line5
  • Drucklinie <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Zeile löschen <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Druckzeile <N>bis <M>inklusive:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Zeile löschen <N>bis <M>inklusive:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Zeilen drucken / löschen, Muster festlegen:

Beispieldatei:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Übereinstimmende Druckzeilen <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Passende Zeilen löschen <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Zeilen von der Zeilenübereinstimmung <pattern1>zur Zeilenübereinstimmung drucken, <pattern2>einschließlich:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Löschen von Zeilen aus der Zeilenübereinstimmung <pattern1>bis <pattern2>einschließlich der Zeilenübereinstimmung:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Befehl: Ersatz

Der Befehl zum Ersetzen einer Auswahl lautet:

  • s: Ersetzt Zeilen, die mit der angegebenen Adresse / dem angegebenen Adressbereich übereinstimmen.

Wenn diesem Befehl keine Adresse / Auswahl vorangestellt ist, wird der Befehl global ausgeführt, dh in jeder Zeile der Eingabedatei.

Die Syntax des sBefehls lautet:

s/<pattern>/<replacement_string>/<pattern_flags>

Schrägstriche sind "Trennzeichen". sie dienen dazu , die zu begrenzen <pattern>, <replacement_string>und <pattern_flags>Abschnitte;

Das Trennzeichen ist immer das Zeichen, das unmittelbar auf den sBefehl folgt . Es kann auf ein beliebiges anderes Zeichen gesetzt werden, zum Beispiel |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>ist ein einfacher oder erweiterter regulärer Ausdruck; <replacement_string>ist ein fester String, der sed-spezifische Sequenzen mit einer speziellen Bedeutung enthalten kann; <pattern_flags>ist eine Liste von Flags, die das Verhalten von ändern <pattern>.

Häufigste sed-spezifische Sequenzen mit einer besonderen Bedeutung:

  • &: Rückverweis durch die Zeichenfolge ersetzt, die mit übereinstimmt <pattern>;
  • \<N>(wo <N>ist eine Zahl): Rückverweis ersetzt durch die in <N>erfasste Gruppe <pattern>;

Häufigste Flaggen:

  • g: Erzwingt <pattern>eine globale Übereinstimmung, dh mehrere Male in jeder Zeile.
  • i: zwingt <pattern>zu einer Übereinstimmung ohne Berücksichtigung der Groß- / Kleinschreibung;
  • p: druckt Zeilen, für die eine Ersetzung erneut durchgeführt wurde (nützlich, wenn der Aufruf des -nSchalters verwendet wird sed, um nur die Zeilen zu drucken, für die eine Ersetzung durchgeführt wurde);

Beispiele: Ersatz

Beispieldatei:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Ersetzen des ersten Auftretens von <pattern>mit <replacement_string>in jeder Zeile:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Alle Vorkommen von <pattern>durch <replacement_string>in jeder Zeile ersetzen :
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Nur Zeilen auswählen, die mit beginnen <pattern1>und alle Vorkommen von <pattern2>mit ersetzen <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Nur Zeilen auswählen, die mit enden <pattern1>und alle Vorkommen von <pattern2>mit ersetzen <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
kos
quelle