J'ai essayé le code suivant pour remplacer QQ
avec ZZ
, mais il ne fait pas ce que je veux:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Cependant, ce code fait ce que je veux:
sed -i 's/QQ/ZZ/g' $file
Comment utiliser les variables dans sed
?
command-line
bash
sed
UAdapter
la source
la source
Réponses:
Le shell est responsable du développement des variables. Lorsque vous utilisez des guillemets simples pour des chaînes, son contenu est traité littéralement. Essayez donc
sed
maintenant de remplacer chaque occurrence du littéral$var1
parZZ
.Utiliser des guillemets doubles
Utilisez des guillemets doubles pour que le shell développe les variables tout en préservant les espaces:
Lorsque vous avez besoin du caractère de citation dans la chaîne de remplacement, vous devez le faire précéder d'une barre oblique inverse qui sera interprétée par le shell. Dans l'exemple suivant, la chaîne
quote me
sera remplacée par"quote me"
(le caractère&
est interprété parsed
):Utiliser des guillemets simples
Si vous avez beaucoup de méta-caractères de shell, envisagez d'utiliser des guillemets simples pour le modèle et des guillemets doubles pour la variable:
Remarquez comment je l’utilise
s,pattern,replacement,
au lieu des/pattern/replacement/
, je l’ai fait pour éviter toute interférence avec les/
in\0/
.Exemple
Le shell exécute ensuite la commande ci-dessus
sed
avec les arguments suivants (en supposantpattern=bert
etfile=text.txt
):Si
file.txt
contientbert
, le résultat sera:la source
g
option, vous passeriez donc à las,foo,bar,g
place.\\0
place de\0
, cela ne devrait pas être fait\0
entre guillemets simples. Sinonsed
, le motif sera remplacé par un motif au\0
lieu de la correspondance complète.Nous pouvons utiliser des variables en
sed
utilisant des guillemets doubles:Si vous avez une barre oblique
/
dans la variable, utilisez un séparateur différent, comme ci-dessous:la source
/
dans la variable => Cela m'a sauvé! Ma variable est une URL et il contient/
. Passer à utiliser|
comme séparateur a résolu mon problème