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 n'a pas fonctionné?
Réponses:
Si vous souhaitez interpréter
$replace
, vous ne devez pas utiliser de guillemets simples car ils empêchent la substitution de variables.Essayer:
en supposant que vous vouliez insérer les guillemets. Si vous ne voulez pas les guillemets, utilisez:
Transcription:
Veillez simplement à ce
${replace}
qu'il n'y ait aucun caractère significatif poursed
(comme/
par exemple) car cela causera 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.la source
set
n'est pas non plus nécessaire (et comment alliez-vous l'utiliser de toute façon?). Justereplace=987654321
.export
pour m'assurer que les variables sont définies pour les enfants mais, comme vous le dites, vous pouvez tout aussi bien l'éviter. Cependant, l'utilisation ou non deexport
n'est pas pertinente ici (un problème de style) et n'a aucun effet sur la réponse réelle, à savoir comment utiliser des variables dans unesed
commande.-i
option. Savez-vous pourquoi? ou comment le faire fonctionner?$
ou`
dans lesed
script soit échappé avec une barre oblique inverse, pour le protéger du mécanisme de substitution du shell pour les chaînes entre guillemets.vous pouvez utiliser le shell (bash / ksh).
la source
/bin/sh
sur de nombreux Linux modernes.Pas spécifique à la question, mais pour les personnes qui ont besoin du même type de fonctionnalité étendue pour plus de clarté par rapport aux réponses précédentes:
la source
Les guillemets simples sont très forts. Une fois à l'intérieur, vous ne pouvez rien faire pour invoquer la substitution de variable, jusqu'à ce que vous quittiez. Utilisez plutôt des guillemets doubles:
la source
J'ai trouvé une solution élégante .
la source
vous pouvez toujours utiliser des guillemets simples, mais vous devez les «ouvrir» lorsque vous voulez que la variable soit développée au bon endroit. sinon la chaîne est prise "littéralement" (comme @paxdiablo l'a correctement indiqué, sa réponse est également correcte)
la source
$replace
dehors des guillemets entraînera la création de jetons d'espaces blancs et l'extension de caractères génériques par le shell sur la valeur. Cela semblera fonctionner avec des valeurs simples, mais pourrait exploser considérablement sur des chaînes non triviales. Ne l'utilisez pas dans le code de production.Pour laisser votre shell développer la variable, vous devez utiliser des guillemets doubles comme
Cela se cassera si
$replace
contiennent dessed
caractères spéciaux (#
,\
). Mais vous pouvez prétraiter$replace
pour les citer:la source
J'avais une exigence similaire à celle-ci, mais mon var de remplacement contenait une esperluette. Échapper à l'esperluette comme ceci a résolu mon problème:
la source
Utilisez plutôt ceci
cela fonctionne pour moi, supprimez simplement les guillemets
la source
Je préfère utiliser des guillemets doubles, car les quptes simples sont très puissants car nous les avons utilisés si nous ne pouvons rien changer à l'intérieur ou si nous pouvons invoquer la substitution de variable.
utilisez donc des guillemets doubles.
la source