web-dev-qa-db-fra.com

substitution sed avec des variables bash

Essayer de changer les valeurs dans un fichier texte en utilisant sed dans un script bash avec la ligne,

sed 's/draw($prev_number;n_)/draw($number;n_)/g' file.txt > tmp

Ce sera dans une boucle for. Je ne sais pas pourquoi cela ne fonctionne pas. Aucune suggestion?

49
csta

Variables à l'intérieur de ' ne vous substituez pas à bash. Pour obtenir une substitution de chaîne (ou une interpolation, si vous connaissez Perl), vous devez la modifier pour utiliser des guillemets doubles " au lieu des guillemets simples:

$ # enclose entire expression in double quotes
$ sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

$ # or, concatenate strings with only variables inside double quotes
$ # this would restrict expansion to relevant portion
$ # and prevent accidental expansion for !, backticks, etc
$ sed 's/draw('"$prev_number"';n_)/draw('"$number"';n_)/g' file.txt > tmp

$ # variable cannot contain arbitrary characters
$ # see link in further reading section for details
$ a='foo 
bar'
$ echo 'baz' | sed 's/baz/'"$a"'/g'
sed: -e expression #1, char 9: unterminated `s' command


Lectures complémentaires:

65
k.parnell

les variables entre guillemets simples ne sont pas développées, entre guillemets doubles elles le sont, utilisez des guillemets doubles dans ce cas.

sed "s/draw($prev_number;n_)/draw($number;n_)/g" file.txt > tmp

Vous pouvez également le faire fonctionner avec eval, mais ne le faites pas !!

13
Paul Creasey
sed "s/draw($prev_number;n_)/draw($number;n_)/g" 

cela fonctionnerait-il?

5
Kent

Vous pouvez utiliser des variables comme ci-dessous. Comme ici, je voulais remplacer hostname ie, variable système dans le fichier. Je recherche une chaîne look.me et en remplaçant toute cette ligne par look.me=<system_name>

sed -i "s/.*look.me.*/look.me=`hostname`/"

Vous pouvez également stocker votre valeur système dans une autre variable et utiliser cette variable pour la substitution.

Host_var=`hostname`

sed -i "s/.*look.me.*/look.me=$Host_var/"


Fichier d'entrée:

look.me=demonic

Sortie du fichier (en supposant que mon nom de système est prod-cfm-frontend-1-usa-central-1):

look.me=prod-cfm-frontend-1-usa-central-1
1
daemonsl