Comment utiliser des variables dans une commande sed?

J'ai essayé le code suivant pour remplacer QQ avec ZZ, mais il ne fait pas ce que je veux:

var1=QQsed -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 de l'expansion des variables. Lorsque vous utilisez des guillemets simples pour les chaînes, son contenu sera traité littéralement, donc sed essaie maintenant de remplacer chaque occurrence du littéral $var1 par ZZ.

Utilisation de guillemets doubles

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 guillemet dans la chaîne de remplacement, vous devez le 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é par "quote me" (caractère & est interprété par sed):

sed -i "s/quote me/\"&\"/" "$file"

Utilisation de guillemets simples

Si vous avez beaucoup de méta-caractères, envisagez d'utiliser des guillemets simples pour le motif et des guillemets doubles pour la variable:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Remarquez comment j'utilise s,pattern,replacement, au lieu de s/pattern/replacement/, Je l'ai fait pour éviter les interférences avec le / dans \0/.

Exemple

Le shell exécute ensuite la commande ci-dessus sed avec les arguments suivants (en supposant pattern=bert et file=text.txt):

-is,bert,Say hurrah to &: \0/,text.txt

Si file.txt contenir bert, la sortie sera:

Say hurrah to bert: \0/

Nous pouvons utiliser des variables dans sed utilisation de 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

Pour développer (jeu de mots) sur réponse de @ mani,

  • cette solution fonctionnera pour les expressions régulières envoyées à d'autres commandes, telles que perl
  • utilisez des guillemets doubles autour de l'expression régulière (oui, même sous les systèmes Unixy) afin d'étendre la variable comme prévu
  • | peut également apparaître dans la valeur de votre variable, alors n'ayez pas peur d'essayer d'autres délimiteurs

voir ma réponse dans ce post de la vôtre

connexes: Escape a string for a sed replace pattern - Stack Overflow