Ich habe versucht , den folgenden Code zu ersetzen , QQmit 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 , QQmit 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. sedVersuchen Sie daher jetzt, jedes Vorkommen des Buchstabens $var1durch 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 medurch 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 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/
gOption, also würdest du s,foo,bar,gstattdessen passen .
\\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 .
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
/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