Wie verwende ich Variablen in einem sed-Befehl?

Antworten:

358

Die Shell ist für das Erweitern von Variablen verantwortlich. Wenn Sie einfache Anführungszeichen für Zeichenfolgen verwenden, wird deren Inhalt wörtlich behandelt. sedVersuchen Sie daher jetzt, jedes Vorkommen des Buchstabens $var1durch zu ersetzen ZZ.

Anführungszeichen verwenden

Verwenden Sie doppelte Anführungszeichen, um die Shell zu erweitern und dabei Leerzeichen beizubehalten:

sed -i "s/$var1/ZZ/g" "$file"

Wenn Sie das Anführungszeichen in der Ersatzzeichenfolge benötigen, müssen Sie ihm einen Backslash voranstellen, der von der Shell interpretiert wird. Im folgenden Beispiel wird die Zeichenfolge quote medurch ersetzt "quote me"(das Zeichen &wird interpretiert von sed):

sed -i "s/quote me/\"&\"/" "$file"

Verwenden von einfachen Anführungszeichen

Wenn Sie viele Shell-Metazeichen haben, können Sie einfache Anführungszeichen für das Muster und doppelte Anführungszeichen für die Variable verwenden:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Beachten Sie, wie ich s,pattern,replacement,statt s/pattern/replacement/, ich habe es Interferenzen mit dem zu vermeiden , /in \0/.

Beispiel

Die Shell führt dann den obigen Befehl sedmit den nächsten Argumenten aus (vorausgesetzt pattern=bertund file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Wenn file.txtenthält bert, wird die Ausgabe sein:

Say hurrah to bert: \0/
Lekensteyn
quelle
2
Wie würde man die "/ g" -Option mit diesem kommagetrennten Formular übergeben?
Blong
6
@ b.long Es ist eine gOption, also würdest du s,foo,bar,gstattdessen passen .
Lekensteyn
1
Ihr Beispiel mit einfachen Anführungszeichen ist besonders nützlich, es deckt sich sehr gut mit Regex-Mustern ab!
Brian Thomas
Wenn Sie versucht sind, \\0statt zu verwenden \0, sollten Sie dies nicht tun, wenn \0es in einfachen Anführungszeichen steht. Andernfalls sedwird das Muster \0anstelle der gesamten Übereinstimmung durch ein Literal ersetzt .
Lekensteyn
Hat den Trick für mich getan.
12.
114

Wir können Variablen in seddoppelten Anführungszeichen verwenden:

sed -i "s/$var/r_str/g" file_name

Wenn /die Variable einen Schrägstrich enthält, verwenden Sie ein anderes Trennzeichen, wie unten dargestellt:

sed -i "s|$var|r_str|g" file_name
mani
quelle
7
Wenn Sie einen Schrägstrich /in der Variablen haben => Das hat mich gerettet! Meine Variable ist eine URL und enthält /. Der Wechsel zur Verwendung |als Trennzeichen hat mein Problem
behoben
Daumen hoch für "Wenn Sie einen Schrägstrich in der Variablen haben"
Tiina