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
BSD sed GNU sed

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
GNU sed

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.


GNU sed

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 die sed Implementierungen. Für GNU sed 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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow