Comment utiliser des variables dans une commande sed?

Réponses:

359

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 sedmaintenant de remplacer chaque occurrence du littéral $var1par ZZ.

Utiliser des 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 mesera remplacée par "quote me"(le caractère &est interprété par sed):

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

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:

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

Remarquez comment je l’utilise s,pattern,replacement,au lieu de s/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 sedavec les arguments suivants (en supposant pattern=bertet file=text.txt):

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

Si file.txtcontient bert, le résultat sera:

Say hurrah to bert: \0/
Lekensteyn
la source
2
Comment passer l'option "/ g" en utilisant ce formulaire séparé par des virgules?
blong
6
@ b.long C'est une goption, vous passeriez donc à la s,foo,bar,gplace.
Lekensteyn
1
Votre exemple entre guillemets est particulièrement utile, couvre bien le motif regex!
Brian Thomas
Si vous êtes tenté d'utiliser à la \\0place de \0, cela ne devrait pas être fait \0entre guillemets simples. Sinon sed, le motif sera remplacé par un motif au \0lieu de la correspondance complète.
Lekensteyn
A fait le tour pour moi.
jimh
114

Nous pouvons utiliser des variables en sedutilisant 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
mani
la source
7
Si vous avez une barre oblique /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
sonlexqt
Pouce en l'air pour "si vous avez une barre oblique dans la variable"
Tiina