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$FOO1
contiene una nueva línea, esto causará un error de sintaxis como el que observó. Si$FOO1
contiene un/
, esto termina els
comando 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
FOO1
para 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
-v
debe preceder a cada declaración de variable.Lo más probable es que una de sus
$FOO
variables contenga caracteres especiales interpretados porsed
.Tengo otra versión de la
sed
cual genera otros mensajes de error, pero aquí hay un ejemplo de un problema similar:En este caso
$VAR
contiene un carácter que se interpretased
como la barra diagonal final.fuente
Como otros han mencionado aquí, depende del contenido de sus variables FOO *. En su caso, usar
sed
es la elección incorrecta porque probablemente contenga algunos caracteres especiales.Eche un vistazo a este enlace y vea la función
gsub_literal
Como
gsub_literal
lee de stdin y escribe en stdout, el uso será:gsub_literal "$search" "$replace" < /home/foo/template > /home/foo/template/finishedresult
Salida 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