
Probé todas las soluciones posibles disponibles en Stack Overflow y sus sitios web relacionados, pero no encontré ninguna solución. Dediqué una cantidad razonable de tiempo a este tema y finalmente publico esta pregunta.
Quiero usar el sed
comando con variables de shell. Mi guión es bastante simple:
## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace
##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with
## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry ## $entry is the variable that contains the file name
Los dos echo
comandos dan los siguientes resultados respectivamente:
PARTITIONEDED BY (date_key ); ## the text I want to be replaced
PARTITIONED BY ( date_key int ); ## the text I want to replace with
O recibo un error:
sed: -e expression #1, char 2: unterminated `s' command
o el texto no se reemplaza en absoluto.
Alguien por favor ayuda. Estoy usando Centos 6 (si eso importa). ¡Gracias de antemano!
Respuesta1
sed: -e expression #1, char 2: unterminated `s' command
El mensaje de error dice que el error ocurre en el segundo carácter, lo que parece curioso. Puedo reproducir esto poniendo una nueva línea al inicio de la primera variable:
$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command
Una nueva línea sin escape finaliza el comando sed. Por supuesto , colocar la nueva línea más adelante a
daría el error en un carácter posterior.
Imprimiste ambas variables anteriormente en el script, pero no estaban entrecomilladas, por lo que se habría eliminado cualquier espacio en blanco inicial en ellas y los espacios en blanco en el medio se mostrarían como espacios simples.
Compruebe lo que realmente contienen sus variables, con algo como esto:
printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"
Esta última es una característica de Bash que muestra la cadena citada de una manera que Bash acepta como entrada. set -x
También mostraría lo que va a la línea de comando de sed, pero necesitarías notar la nueva línea literal en su salida.
Entonces, si todo lo que hay es una nueva línea inicial, puede eliminarla al comienzo del script:
to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}
(Puede combinarlos en uno solo, pero los pasos separados funcionan incluso si la nueva línea no está allí).
Respuesta2
Prueba esto
sed -i -e "s@$to_replace@$replace_with@g" "$entry"
dónde
-i
significa reemplazar "en su lugar". Si no usa-i
reemplazar, estará en la salida estándar.