2012-06-21 22 views
21

Me parece que no puede utilizar una variable en un comando sed, por ejemplo:utilizar una variable en un comando sed

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

Quiero $ct_tname la variable, no literalmente $ct_tname, que es lo que me siguen dando .

¿Alguien sabe cómo hacer que esto funcione?

El problema es en realidad más complejo y omití algo de información.

ct_fname="%let outputfile="/user/ct_"$1".csv";" 

Aquí, $1 es el argumento que se pasa en el comienzo de mi escritura del golpe (sed se ejecuta dentro de un script bash).

Esto no se ejecuta correctamente, pero se ejecuta si reemplazo ct_fname con

ct_fname="%let table=ct_$1;" 

¿Hay una manera de conseguir la primera ct_fname a ser superado con éxito?

+0

posible duplicado de [Cómo utilizar una variable escritura del golpe con SED] (http://stackoverflow.com/questions/3204302/how-to-use-a-bash-script-variable-with-sed) –

+0

posible duplicado de [sed scripting - sustitución de variable de entorno] (http: // stackoverflow. com/questions/584894/sed-scripting-environment-variable-substitution) – tripleee

Respuesta

34

necesita utilizar comillas dobles (") en lugar de comillas simples ('). las comillas simples pasan su contenido literalmente, sin traducir variables (expansión).

tratar

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 

por cierto, si vas a ser la edición de un archivo (es decir, si file2.sas es un archivo temporal), usted debe utilizar ed lugar.

+0

ha aparecido tantas veces en SO que debería prohibirse que se responda nuevamente: P Creo que S.O. debe evitar que se publique una pregunta, si encuentra un tema similar, bueno, no lo previene, pero advierta antes de publicar que ya se ha respondido una pregunta parecida, y solicite a los usuarios que la comprueben primero antes de proceder a publicar su pregunta. – c00kiemon5ter

+0

En realidad, mi problema es un poco más complejo y no se soluciona simplemente cambiando 'a', la pregunta editada es anterior. Creo que el problema que estoy enfrentando es bastante desafiante y no la consulta común que surgen en SO con respecto a esto. – user788171

1

Debe utilizar comillas dobles ("), con comillas simples (') el valor de la variable no se reemplaza. Puesto que usted tiene comillas en el texto de reemplazo, tiene que escapar de ellos: las variables

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

Shell no se expanden entre comillas simples. Tal vez puedas probar:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

Otras respuestas se centran en el uso de comillas dobles con escape en sus ejemplos. Tenga en cuenta que esto no es siempre lo que quiere:

$ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/" 
foo"auie"bar 
$ FOO="auie"; echo foo123bar|sed "s/123/$FOO/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/" 
foo123bar 
3

En mi caso, yo sólo remplaced comillas simples por las dobles:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done 

Por ahora, está funcionando bien ...

0

El problema es que cuando se sustituye $ct_fname, sed ve adicionales / separadores, por lo

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

convierte

sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas 

y obtendrá un error de sed porque hay 5 / en lugar del 3 esperado.

En su lugar, cambiar sus sed separadores a un carácter no utilizado como | o :, y, o bien entre comillas simples o dobles funcionará bien:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas 
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas 
Cuestiones relacionadas