2010-07-22 21 views
61

Estoy usando el siguiente código para reemplazar una cadena dentro de un script de shell.Reemplazar una cadena en script de shell utilizando una variable

echo $LINE | sed -e 's/12345678/"$replace"/g' 

pero cada vez es reemplazado por $replace en lugar del valor de esa variable.

¿Alguien podría decir qué salió mal?

+0

Para la pregunta relacionada más común sobre el manejo de valores con barras en ellos, vea http://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace – tripleee

Respuesta

87

Si desea interpretar $replace, no debe usar comillas simples ya que impiden la sustitución de variables.

Probar:.

echo $LINE | sed -e "s/12345678/\"${replace}\"/g" 

si quiere enviar las cotizaciones puesto en Si no lo hace quieren las comillas, utilice:

echo $LINE | sed -e "s/12345678/${replace}/g" 

Transcripción:

pax> export replace=987654321 
pax> echo X123456789X | sed "s/123456789/${replace}/" 
X987654321X 
pax> _ 

Solo tenga cuidado de asegurarse de que ${replace} no tenga ningún carácter tros de importancia para sed (como / por ejemplo) ya que causará confusión a menos que se escape. Pero si, como dices, estás reemplazando un número por otro, eso no debería ser un problema.

+0

. No quiero poner las comillas. Quiero un número para ser reemplazado con otro – Vijay

+2

'export' no es necesario. –

+1

paxdiablo: 'set' tampoco es necesario (¿y cómo ibas a usarlo de todos modos?). Simplemente 'replace = 987654321'. –

3
echo $LINE | sed -e 's/12345678/'$replace'/g' 

puede seguir utilizando comillas simples, pero debe "abrirlas" cuando desee que la variable se expanda en el lugar correcto. de lo contrario, la cadena se toma "literalmente" (como @paxdiablo correctamente indicado, su respuesta es correcta también)

+0

Esto tiene el problema de que usar '$ replace' fuera de cualquier comilla hará que el shell realice una tokenización de espacio en blanco y una expansión de comodín en el valor. Esto parecerá funcionar con valores simples, pero podría explotar dramáticamente en cadenas no triviales. No use esto en el código de producción. – tripleee

52

puede usar el shell (bash/ksh).

$ var="12345678abc" 
$ replace="test" 
$ echo ${var//12345678/$replace} 
testabc 
+3

¿Quieres mencionar que es específico de bash (y ksh?). Probablemente no sea importante para la mayoría de las personas, pero algunos de nosotros todavía estamos obligados a trabajar en UNIXen antiguo :-) – paxdiablo

+4

Tenga cuidado, esto también falla en el tablero, que es '/ bin/sh' en muchos Linuxes modernos. – phihag

5

Las comillas simples son muy fuertes. Una vez dentro, no hay nada que puedas hacer para invocar la sustitución de variables, hasta que te vayas. Utilizar comillas dobles en su lugar:

echo $LINE | sed -e "s/12345678/$replace/g" 
-1

Yo prefiero usar comillas dobles, como quptes individuales son muy poderosos como los usamos, si no te capaces de cambiar nada en su interior o se puede invocar la variable substituion.

así que use comillas dobles instaladas.

echo $LINE | sed -e "s/12345678/$replace/g" 
+4

¿Es esto diferente de Dave [respuesta] (http://stackoverflow.com/a/6756853/2235132)? – devnull

1

dejar que su cáscara ampliar la variable, es necesario utilizar comillas dobles como

sed -i "s#12345678#$replace#g" file.txt 

Esto romperá si $replace contienen caracteres especiales (sed#, \).Pero se puede preprocesar $replace citarlos:

replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g') 
sed -i "s#12345678#$replace_quoted#g" file.txt 
7

no específica a la pregunta, pero para las personas que necesitan el mismo tipo de funcionalidad ampliada para mayor claridad de las respuestas anteriores:

str="someFileName.foo" 
find=".foo" 
replace=".bar" 
result=${str//$find/$replace} 
echo $result  
# result is: someFileName.bar 

str="someFileName.sally" 
find=".foo" 
replace=".bar" 
result=${str//$find/$replace} 
echo $result  
# result is: someFileName.sally because ".foo" was not found 
0

Use esto en lugar

echo $LINE | sed -e 's/12345678/$replace/g' 

esto funciona para mí sólo basta con quitar las comillas

Cuestiones relacionadas