2010-07-08 13 views
14

que ejecute el siguiente script bash:Cómo utilizar una variable escritura del golpe con sed

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

Estoy esperando para reemplazar todas las instancias de $ {} version.number con el contenido de la "versión" variables . En su lugar, se está insertando la versión $ del texto literal.

¿Qué debo hacer para que sed use el valor actual de $ version en su lugar?

Respuesta

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

Las únicas comillas dobles hacen el reemplazo del signo de dólar. Eso también significa que las comillas simples no requieren que se escape el signo de dólar.

+0

Pero el signo de dólar tiene que ser escapado porque la expresión se trata como una expresión regular por 'sed'. Entonces creo que debería ser '\\ $'. – Philipp

+1

@Philipp, en realidad, el signo '$' es solo un delimitador cuando es el último carácter de la expresión regular (o posiblemente subexpresión). Pero admito que tuve suerte. ;) Opcionalmente puede agregar una barra escapada, pero luego es '\\\ $'. –

+0

Gracias por la corrección. – Philipp

4

También podría simplemente Unquote las variables

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

Esto funcionó mejor. – Val

0

Es un poco viejo, pero todavía puede ser útil ... Para mí trabajaron usando un doble de escape como se dijo Philip (y escapar paréntesis, si los usa ...):

#!/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; 
Cuestiones relacionadas