it-swarm.com.de

Ersetzen Sie eine Zeichenfolge im Shell-Skript mithilfe einer Variablen

Ich verwende den folgenden Code zum Ersetzen einer Zeichenfolge In einem Shell-Skript.

echo $LINE | sed -e 's/12345678/"$replace"/g'

es wird jedoch durch $replace anstelle des Wertes dieser Variablen ersetzt.

Kann jemand sagen, was schief gelaufen ist?

70
Vijay

Wenn Sie $replace interpretieren möchten, sollten Sie keine einfachen Anführungszeichen verwenden, da diese das Ersetzen von Variablen verhindern.

Versuchen:

echo $LINE | sed -e "s/12345678/\"${replace}\"/g"

angenommen, Sie möchten, dass die Zitate eingefügt werden. Wenn Sie nicht die Zitate möchten, verwenden Sie:

echo $LINE | sed -e "s/12345678/${replace}/g"

Abschrift:

pax> export replace=987654321
pax> echo X123456789X | sed "s/123456789/${replace}/"
X987654321X
pax> _

Seien Sie jedoch vorsichtig, um sicherzustellen, dass ${replace} keine Zeichen von Bedeutung für sed hat (wie / zum Beispiel), da dies zu Verwirrung führt, wenn es nicht mit einem Escapezeichen versehen wird. Aber wenn Sie, wie Sie sagen, eine Nummer durch eine andere ersetzen, sollte das kein Problem sein.

108
paxdiablo

sie können die Shell (bash/ksh) verwenden. 

$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
61
ghostdog74

Nicht spezifisch für die Frage, aber für Leute, die dieselbe Funktionalität benötigen, um die Klarheit der vorherigen Antworten zu verbessern:

str="someFileName.foo"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result    
# result is: someFileName.bar

str="someFileName.sally"
find=".foo"
replace=".bar"
result=${str//$find/$replace}
echo $result    
# result is: someFileName.sally because ".foo" was not found
11
bob

Einzelne Anführungszeichen sind sehr stark. Sobald Sie sich darin befinden, können Sie nichts mehr tun, um die Variablensubstitution aufzurufen, bis Sie gehen. Verwenden Sie stattdessen doppelte Anführungszeichen:

echo $LINE | sed -e "s/12345678/$replace/g"
5
Dave
echo $LINE | sed -e 's/12345678/'$replace'/g'

sie können immer noch einfache Anführungszeichen verwenden, aber Sie müssen sie "öffnen", wenn die Variable an der richtigen Stelle erweitert werden soll. ansonsten wird die Zeichenfolge "wörtlich" genommen (wie @paxdiablo richtig angegeben hat, ist auch seine Antwort richtig)

3
akira

Damit Ihre Shell die Variable erweitern kann, müssen Sie doppelte Anführungszeichen wie verwenden

sed -i "s#12345678#$replace#g" file.txt

Dies wird fehlschlagen, wenn $replace spezielle sed-Zeichen enthält (#, \). Sie können jedoch $replace vorverarbeiten, um sie zu zitieren:

replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g')
sed -i "s#12345678#$replace_quoted#g" file.txt
1
Matthieu Moy

Verwenden Sie stattdessen diese

echo $LINE | sed -e 's/12345678/$replace/g'

das funktioniert für mich, einfach die Anführungszeichen entfernen

0
Tunde Pizzle

Eine anmutige Lösung gefunden .

echo ${LINE//12345678/$replace}
0
Nicolae Iotu