Tengo un conjunto de reemplazos sed en un script bash y recibo un error sobre un comando 's' no terminado. Así es como se ve la línea sed:
sed -n -e "s/TMPFOO1/$FOO1/" -e "s/TMPFOO2/$FOO2/" -e "s/TMPFOO3/$FOO3/" -e "s/TMPFOO4/$FOO4/" -e "s/TMPFOO5/$FOO5/" /home/foo/template > /home/foo/template/finishedresult
Sin embargo, por alguna razón, a bash no le gusta esto y recibo un error sobre
sed: -e expression #4, char 69: unterminated `s' command
¿Que me estoy perdiendo aqui? ¿Cómo puedo hacer que SED ingrese la variable? Me parece que todos están terminados.
shell-script
text-processing
sed
Mike B
fuente
fuente

Respuestas:
No puede interpolar una variable de forma segura en un comando sed, porque la sustitución se realiza por el shell, no por sed. El valor de la variable se convierte en sintaxis sed. Por ejemplo, en
"s/TMPFOO1/$FOO1/", si$FOO1contiene una nueva línea, esto causará un error de sintaxis como el que observó. Si$FOO1contiene un/, esto termina elscomando y puede causar un error o puede hacer que se ejecuten otros comandos (si lo que/sucede después de la sintaxis sed es válida).Si bien puede hacer un primer paso de sustitución
FOO1para citar sus caracteres especiales para su inclusión en ese comando sed, es mucho más simple usar awk. Awk tiene una noción de variable y una sintaxis de línea de comando para establecer el valor inicial de una variable.fuente
-vdebe preceder a cada declaración de variable.Lo más probable es que una de sus
$FOOvariables contenga caracteres especiales interpretados porsed.Tengo otra versión de la
sedcual genera otros mensajes de error, pero aquí hay un ejemplo de un problema similar:En este caso
$VARcontiene un carácter que se interpretasedcomo la barra diagonal final.fuente
Como otros han mencionado aquí, depende del contenido de sus variables FOO *. En su caso, usar
sedes la elección incorrecta porque probablemente contenga algunos caracteres especiales.Eche un vistazo a este enlace y vea la función
gsub_literalComo
gsub_literallee de stdin y escribe en stdout, el uso será:gsub_literal "$search" "$replace" < /home/foo/template > /home/foo/template/finishedresultSalida de muestra:
fuente
El problema se ha resuelto para mí probando barras diagonales adicionales dentro del
sed 's/.../.../g'comando. Este comandome dio este mensaje de error
cuando se ejecutó como parte de un script c-shell, y lo hizo solo con una versión reciente de
sed, no con una versión anterior. (Curiosamente, el mismo comando funciona bien cuando se da en la línea de comando (en un shell tc)).El problema con el script c-shell se ha solucionado precediendo al
äcarácter con una barra diagonal inversa:fuente