Question Comment utiliser des variables dans une commande sed?


J'ai essayé le code suivant pour remplacer QQ avec ZZ, mais ça 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?


178
2017-11-07 16:30


origine


voir ma réponse dans ce post de votre part - ata
en relation: stackoverflow.com/questions/407523/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Réponses:


Le shell est responsable de l'expansion des variables. Lorsque vous utilisez des guillemets simples pour des chaînes, son contenu sera traité littéralement, donc sed essaye maintenant de remplacer chaque occurrence du littéral $var1 par ZZ.

Utiliser des guillemets

Utilisez des guillemets doubles pour que le shell développe des 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é par "quote me" (le personnage & est interprété par sed):

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

Utiliser des guillemets simples

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"

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 alors la commande ci-dessus sed avec les arguments suivants (en supposant 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/

252
2017-11-07 17:20



Comment passerait-il l'option "/ g" en utilisant cette forme séparée par des virgules? - blong
@ b.long C'est un g option, donc vous passeriez s,foo,bar,g au lieu. - Lekensteyn
votre exemple de devis unique est particulièrement utile, couvre sed en utilisant assez bien le modèle de regex! - Brian Thomas
Au cas où vous seriez tenté d'utiliser \\0 au lieu de \0, cela ne devrait pas être fait quand \0 est entouré de guillemets simples. Autrement sed va substituer le modèle pour un littéral \0 au lieu du match entier. - Lekensteyn


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 ensuite un séparateur différent, comme ci-dessous:

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

78
2017-08-07 15:29