Wie verwende ich Variablen in einem sed-Befehl?

194

Ich habe folgenden Code ausprobiert, um QQ durch ZZ zu ersetzen, aber er tut nicht das, 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 ?

    
UAdapter 07.11.2011, 17:30
quelle

2 Antworten

268

Die Shell ist für das Erweitern von Variablen verantwortlich. Wenn Sie einfache Anführungszeichen für Zeichenfolgen verwenden, wird der Inhalt wörtlich behandelt, sodass sed nun versucht, jedes Vorkommen des literalen $var1 durch ZZ zu ersetzen.

Anführungszeichen verwenden

Verwenden Sie doppelte Anführungszeichen, um die Shell dazu zu bringen, Variablen zu erweitern und dabei Leerzeichen zu erhalten:

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

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

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

Verwenden von einfachen Anführungszeichen

Wenn Sie viele Shell-Metazeichen haben, sollten Sie einfache Anführungszeichen für das Muster und doppelte Anführungszeichen für die Variable in Betracht ziehen:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"

Beachten Sie, wie ich s,pattern,replacement, anstelle von s/pattern/replacement/ verwende. Ich habe es gemacht, um eine Interferenz mit / in sed/ zu vermeiden.

Beispiel

Die Shell führt dann den obigen Befehl pattern=bert mit den nächsten Argumenten aus (unter Annahme von file=text.txt und file.txt ):

%pre%

Wenn bert %code% enthält, lautet die Ausgabe:

%pre%     
Lekensteyn 07.11.2011, 18:20
quelle
84

Wir können Variablen in sed mit Anführungszeichen verwenden:

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

Wenn Sie in der Variablen einen Schrägstrich / haben, verwenden Sie ein anderes Trennzeichen wie unten:

sed -i "s|$var|r_str|g" file_name
    
mani 07.08.2014 17:29
quelle

Tags und Links