web-dev-qa-db-fra.com

Remplacer une chaîne dans un script shell à l'aide d'une variable

J'utilise le code ci-dessous pour remplacer une chaîne Dans un script Shell.

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

mais il est remplacé par $replace au lieu de la valeur de cette variable.

Quelqu'un pourrait-il dire ce qui s'est mal passé?

70
Vijay

Si vous voulez interpréter $replace, vous ne devez pas utiliser de guillemets simples car ils empêchent la substitution de variable.

Essayer:

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

en supposant que vous vouliez mettre les guillemets. Si vous ne pas voulez les guillemets, utilisez:

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

Transcription:

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

Veillez simplement à ce que ${replace} ne contienne aucun caractère significatif pour sed (comme / par exemple), car cela provoquerait de la confusion à moins d'être échappé. Mais si, comme vous le dites, vous remplacez un numéro par un autre, cela ne devrait pas poser de problème.

108
paxdiablo

vous pouvez utiliser le shell (bash/ksh). 

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

Pas spécifique à la question, mais pour les personnes qui ont besoin du même type de fonctionnalité, pour plus de clarté à partir des réponses précédentes:

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

Les guillemets simples sont très forts. Une fois à l'intérieur, vous ne pouvez rien faire pour invoquer la substitution de variable, jusqu'à votre départ. Utilisez des guillemets doubles à la place:

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

vous pouvez toujours utiliser des guillemets simples, mais vous devez les "ouvrir" lorsque vous souhaitez que la variable soit étendue au bon endroit. sinon la chaîne est prise "littéralement" (comme @paxdiablo l'a bien indiqué, sa réponse est également correcte)

3
akira

Pour laisser votre shell développer la variable, vous devez utiliser des guillemets doubles, comme

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

Cela se cassera si $replace contient des caractères spéciaux sed (#, \). Mais vous pouvez prétraiter $replace pour les citer:

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

Utilisez ceci à la place

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

cela fonctionne pour moi tout simplement supprimer les guillemets

0
Tunde Pizzle

Trouvé une solution gracieuse .

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