Comment utiliser des variables dans une commande sed?

196

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

    
posée UAdapter 07.11.2011 - 17:30
la source

2 réponses

273

Le shell est responsable du développement des variables. Lorsque vous utilisez des guillemets simples pour les chaînes, son contenu est traité littéralement. sed tente donc 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 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 ):

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

Utilisation de guillemets simples

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

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: 
sed -i "s/$var1/ZZ/g" "$file"
/
/, text.txt
/,' "$file"

Notez que j'utilise s,pattern,replacement, au lieu de s/pattern/replacement/ . Je l'ai fait pour éviter toute interférence avec / dans sed/ .

Exemple

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

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

Si bert contient %code% , le résultat sera:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"
    
réponse donnée Lekensteyn 07.11.2011 - 18:20
la source
85

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

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

Si vous avez un slash / dans la variable, utilisez un séparateur différent, comme ci-dessous:

sed -i "s|$var|r_str|g" file_name
    
réponse donnée mani 07.08.2014 - 17:29
la source

Lire d'autres questions sur les étiquettes