J'ai essayé le code suivant pour remplacer QQ
par ZZ
, mais cela 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
?
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. sed
tente maintenant de remplacer chaque occurrence du littéral $var1
par ZZ
name__.
Utilisez des guillemets doubles pour que le shell développe les variables tout en préservant les espaces:
sed -i "s/$var1/ZZ/g" "$file"
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é par sed
name__):
sed -i "s/quote me/\"&\"/" "$file"
Si vous avez beaucoup de méta-caractères Shell, envisagez d'utiliser des guillemets simples pour le modèle et des guillemets doubles pour la variable:
sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"
Notez que j’utilise s,pattern,replacement,
au lieu de s/pattern/replacement/
. Je l’ai fait pour éviter d’interférer avec le /
dans \0/
.
Le shell exécute ensuite la commande ci-dessus sed
avec les arguments suivants (en supposant que pattern=bert
et file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Si file.txt
contient bert
name__, le résultat sera:
Say hurrah to bert: \0/
Nous pouvons utiliser des variables dans sed
en utilisant des guillemets doubles:
sed -i "s/$var/r_str/g" file_name
Si vous avez une barre oblique /
dans la variable, utilisez un séparateur différent, comme ci-dessous:
sed -i "s|$var|r_str|g" file_name