Ich habe versucht , den folgenden Code zu ersetzen , QQ
mit ZZ
, aber es nicht tut , was ich will:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Dieser Code macht jedoch, was ich will:
sed -i 's/QQ/ZZ/g' $file
Wie verwende ich Variablen in sed
?
Ich habe versucht , den folgenden Code zu ersetzen , QQ
mit ZZ
, aber es nicht tut , was ich will:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Dieser Code macht jedoch, was ich will:
sed -i 's/QQ/ZZ/g' $file
Wie verwende ich Variablen in sed
?
Antworten:
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. sed
Versuchen Sie daher jetzt, jedes Vorkommen des Buchstabens $var1
durch zu ersetzen ZZ
.
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 me
durch ersetzt "quote me"
(das Zeichen &
wird interpretiert von sed
):
sed -i "s/quote me/\"&\"/" "$file"
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/
.
Die Shell führt dann den obigen Befehl sed
mit den nächsten Argumenten aus (vorausgesetzt pattern=bert
und file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Wenn file.txt
enthält bert
, wird die Ausgabe sein:
Say hurrah to bert: \0/
g
Option, also würdest du s,foo,bar,g
stattdessen passen .
\\0
statt zu verwenden \0
, sollten Sie dies nicht tun, wenn \0
es in einfachen Anführungszeichen steht. Andernfalls sed
wird das Muster \0
anstelle der gesamten Übereinstimmung durch ein Literal ersetzt .
Wir können Variablen in sed
doppelten 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
/
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