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 sed
4.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- sed
Seite 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 sed
angewendet?
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
sed
Liest die Eingabe aus einer im Dateisystem gespeicherten Datei, wenn während des Aufrufs in den Befehlszeilenargumenten ein Dateiname angegeben wird oder stdin
wenn 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!
sed
Standardmäß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 p
oder ein d
Befehl angegeben ist *, sed
wird 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 sed
zusammen mit dem -n
Schalter 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
, d
und s
Befehle, die die Befehle in dieser Antwort abgedeckt sind.
Auswahl der Linien
sed
kann 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 sed
zusammen mit dem -n
Schalter 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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
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 s
Befehls 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 s
Befehl 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 -n
Schalters 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
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.