sed
Auswechslung
Suche…
Substitution mit Shell-Variablen
Variablen in einfachen Anführungszeichen '
nicht von POSIX - kompatible Shells erweitert erhalten, so ein Shell - Variable in einer mit sed
Substitution erfordert die Verwendung von doppelten Anführungszeichen "
statt einfacher Anführungszeichen '
:
$ var="he"
$ echo "hello" | sed "s/$var/XX/"
XXllo
$ var="he"
$ echo "hello" | sed 's/$var/XX/'
hello
Seien Sie vorsichtig bei der Befehlseingabe, wenn Sie Variablen auswerten:
$ var='./&/;x;w/etc/passwd
> x;s/he'
$ echo "hello" | sed "s/$var/XX/"
sed: /etc/passwd: Permission denied
Wenn das obige als root ausgeführt wurde, wäre die Ausgabe vom ersten Beispiel nicht zu unterscheiden, und der Inhalt von /etc/passwd
würde zerstört werden.
Rückverweis
Mit Hilfe von eckigen Klammern können Sie eine Erfassungsgruppe in einem Muster definieren, das in der Ersetzungszeichenfolge mit \1
rückverfolgt werden kann:
$ echo Hello world! | sed 's/\(Hello\) world!/\1 sed/'
Hello sed
Bei mehreren Gruppen:
$ echo one two three | sed 's/\(one\) \(two\) \(three\)/\3 \2 \1/'
three two one
Bei der Verwendung erweiterter regulärer Ausdrücke (siehe Zusätzliche Optionen ) wird die Gruppierung standardmäßig in Klammern durchgeführt und muss nicht mit Escapezeichen versehen werden:
$ echo one two three | sed -E 's/(one) (two) (three)/\3 \2 \1/'
three two one
Wörter, die aus Buchstaben, Ziffern und Unterstrichen bestehen, können mit dem Ausdruck [[:alnum:]_]\{1,\}
abgeglichen werden:
$ echo Hello 123 reg_exp | sed 's/\([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\)/\3 \2 \1/'
reg_exp 123 Hello
Die Folge \w
ist äquivalent zu [[:alnum:]_]
$ echo Hello 123 reg_exp | sed 's/\(\w\w*\) \(\w\w*\) \(\w\w*\)/\3 \2 \1/'
reg_exp 123 Hello
Verwendung verschiedener Trennzeichen
POSIX / IEEE-Basisgruppenspezifikation sagt :
[2addr] s / BRE / Ersetzung / Flags
Ersetzen Sie die Ersetzungszeichenfolge durch Instanzen der BRE im Musterbereich. Anstelle eines Schrägstrichs können andere Zeichen als Backslash oder Newline verwendet werden, um die BRE und den Ersatz zu begrenzen. Innerhalb der BRE und der Ersetzung kann der BRE-Begrenzer selbst als Literalzeichen verwendet werden, wenn ihm ein Backslash vorangestellt ist.
Es gibt Fälle, in denen sich das Trennzeichen /
für die Ersetzung von sed
in der BRE oder der Ersetzung befindet und Fehler auslöst, wie:
$ echo "2/3/4" | sed "s/2/3/X/"
sed: -e expression #1, char 7: unknown option to `s'
Dafür können wir verschiedene Trennzeichen wie #
oder _
oder sogar ein Leerzeichen verwenden:
$ echo "2/3/4" | sed "s#2/3#X#"
X/4
$ echo "2/3/4" | sed "s_2/3_X_"
X/4
$ echo "2/3/4" | sed "s 2/3 X "
X/4
Musterflaggen - Vorkommensersatz
Wenn wir nur das erste Vorkommen in einer Zeile ersetzen möchten, verwenden wir wie üblich sed
:
$ cat example
aaaaabbbbb
aaaaaccccc
aaaaaddddd
$ sed 's/a/x/' example
xaaaabbbbb
xaaaaccccc
xaaaaddddd
Was aber, wenn wir alle Vorkommnisse ersetzen wollen?
Wir fügen einfach die g
Musterflagge am Ende hinzu:
$ sed 's/a/x/g' example
xxxxxbbbbb
xxxxxccccc
xxxxxddddd
Und wenn wir ein bestimmtes Vorkommnis ersetzen möchten, können wir tatsächlich angeben, welches Vorkommnis:
$ sed 's/a/x/3' example
aaxaabbbbb
aaxaaccccc
aaxaaddddd
/3
ist das 3. Vorkommen.
info sed
finden Sie im GNU sed-Handbuch für die Online-Version
Der POSIX-Standard legt nicht fest, was passieren soll, wenn Sie die Modifizierer
g
und NUMBER mischen. Derzeit gibt es keine allgemein anerkannte Bedeutung für diesed
Implementierungen. Für GNUsed
ist die Interaktion wie folgt definiert: Ignoriere Übereinstimmungen vor der NUMMER-Zahl und stelle dann alle Übereinstimmungen ab und ersetze alle Übereinstimmungen ab NUMBERth.
$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd
$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd