2010-07-08 6 views
14

j'exécuter le script bash suivant:Comment utiliser une variable de script bash avec sed

#!/bin/bash 
version=$1 
echo $version 
sed 's/\${version.number}/$version/' template.txt > readme.txt 

Je me attends à remplacer toutes les occurrences de $ {version.number} avec le contenu de la variable "version" . Au lieu de cela, la version texte littérale $ est insérée.

Que dois-je faire pour que sed utilise la valeur actuelle de $ version à la place?

Répondre

17
sed "s/\${version.number}/$version/" template.txt > readme.txt 

Seules les guillemets doubles remplacent le symbole du dollar. Cela signifie également que les guillemets simples ne nécessitent pas l'échappement du symbole dollar.

+0

Mais le signe dollar doit être échappé car l'expression est traitée comme une regex par 'sed'. Donc je pense que ça devrait être '\\ $'. – Philipp

+1

@Philipp, en fait le signe '$' est seulement une ancre quand c'est le dernier caractère de la regex (ou éventuellement une sous-expression). Mais j'avoue que j'ai eu de la chance. ;) Vous pouvez éventuellement ajouter une barre oblique échappée, mais c'est '\\\ $'. –

+0

Merci pour la correction. – Philipp

4

Vous pouvez également CITATION simplement les variables

sed 's/'${version.number}'/'$version'/' template.txt > readme.txt 
+0

Cela a fonctionné le mieux. – Val

0

Il est un peu vieux, mais il pourrait encore être utile ... Pour moi, il a travaillé à l'aide d'une double évasion comme Philippe dit (et échapper entre parenthèses, si vous les utilisez ...):

#!/bin/bash 
LIVE_DB_NAME='wordpress'; 
STAGING='staging'; 
sed -r "s/define\('DB_NAME', '[a-zA-Z0-9]+'\);/define('DB_NAME', '\\${LIVE_DB_NAME}');/" ${STAGING}/wp-config.php >tmp1; 
Questions connexes