474 votes

Comment utiliser des variables dans une commande sed ?

J'ai essayé le code suivant pour remplacer QQ con 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 ?

0 votes

626voto

Lekensteyn Points 162346

Le Shell est responsable de l'expansion des variables. Lorsque vous utilisez des guillemets simples pour les chaînes de caractères, leur contenu sera traité littéralement, ainsi sed essaie maintenant de remplacer chaque occurrence du littéral $var1 par ZZ .

Utilisation des guillemets

Utilisez des guillemets doubles pour que le Shell développe les variables tout en préservant les espaces blancs :

sed -i "s/$var1/ZZ/g" "$file"

Lorsque vous avez besoin du caractère quote 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é par "quote me" (le caractère & est interprété par sed ) :

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

Utilisation des guillemets simples

Si vous avez beaucoup de métacaractères Shell, pensez à 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 toute interférence avec le / sur \0/ .

Exemple

Le Shell exécute alors 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 le résultat sera :

Say hurrah to bert: \0/

2 votes

Comment passer l'option "/g" en utilisant cette forme séparée par des virgules ?

7 votes

@b.long C'est un g vous devez donc passer l'option s,foo,bar,g ではなく

1 votes

Votre exemple de citation unique est particulièrement utile, il couvre bien l'utilisation du modèle regex par sed !

199voto

niels Points 181

Nous pouvons utiliser des variables dans sed en utilisant des guillemets :

sed -i "s/$var/r_str/g" file_name

Si vous avez une barre oblique / dans la variable puis utiliser un séparateur différent, comme ci-dessous :

sed -i "s|$var|r_str|g" file_name

33 votes

Si vous avez une barre oblique / dans la variable => Cela m'a sauvé ! Ma variable est une url et elle contient / . Passage à l'utilisation | comme le sépar sépar sépar sépar sépar sépar sépar sépar résol résol résol résol résol résol résol mon problème

9 votes

Pouce pour "si vous avez une barre oblique dans la variable".

1 votes

1voto

JDQ Points 149

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

  • cette solution fonctionnera pour les expressions régulières fournies à d'autres commandes, telles que perl
  • utiliser des guillemets doubles autour de la regex (oui, même sous les systèmes Unixy) dans afin de développer la variable comme prévu
  • | peut également apparaître dans la valeur de votre variable, alors n'hésitez pas à utiliser d'autres délimiteurs.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X