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é?
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.
vous pouvez utiliser le shell (bash/ksh).
$ var="12345678abc"
$ replace="test"
$ echo ${var//12345678/$replace}
testabc
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
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"
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)
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
Utilisez ceci à la place
echo $LINE | sed -e 's/12345678/$replace/g'
cela fonctionne pour moi tout simplement supprimer les guillemets
Trouvé une solution gracieuse .
echo ${LINE//12345678/$replace}