substitution sed avec 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?

Les variables internes ne sont pas substituées dans bash. Pour obtenir une substitution de chaîne (ou une interpolation, si vous êtes familier avec perl), vous devrez la changer pour utiliser des guillemets " 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 ssortingngs with only variables inside double quotes $ # this would ressortingct 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:

  • Différence entre guillemets simples et doubles dans Bash
  • Est-il possible d’échapper à des méta-caractères regex de manière fiable avec sed
  • Utilisation de différents délimiteurs pour la commande sed substitute
  • Sauf si vous en avez besoin dans un fichier différent, vous pouvez utiliser le drapeau -i pour changer le fichier en place

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

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

Vous pouvez aussi le faire fonctionner avec eval , mais ne faites pas ça !!

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

cela fonctionnerait-il?

Vous pouvez utiliser des variables comme ci-dessous. Comme ici, je voulais remplacer le hostname c’est-à-dire la variable système dans le fichier. Je cherche la chaîne look.me et remplace toute cette ligne par look.me=

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

Vous pouvez également stocker la valeur de votre 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 de 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