¿Cómo reemplazar los marcadores de posición ${} en un archivo de texto?

Resuelto Dana the Sane asked hace 15 años • 19 respuestas

Quiero canalizar la salida de un archivo de "plantilla" a MySQL, el archivo tiene variables como ${dbName}intercaladas. ¿Cuál es la utilidad de línea de comando para reemplazar estas instancias y volcar la salida a la salida estándar?

El archivo de entrada se considera seguro, pero podrían existir definiciones de sustitución defectuosas. Realizar el reemplazo debería evitar la ejecución de código no deseado.

Dana the Sane avatar Jan 06 '09 14:01 Dana the Sane
Aceptado

Actualización: prueba envsubst

Aquí hay una solución de yottatsa a una pregunta similar que solo reemplaza variables como $VAR o ${VAR}, y es una breve frase

i=32 word=foo envsubst < template.txt

Por supuesto, si yo y Word estamos en su entorno, entonces es simplemente

envsubst < template.txt

En mi Mac parece que se instaló como parte de gettext y desde MacGPG2

Antigua respuesta: prueba eval

Aquí hay una mejora a la solución de mogsie en una pregunta similar, mi solución no requiere que escapes las comillas dobles, la de mogsie sí, ¡pero la suya es de una sola línea!

eval "cat <<EOF
$(<template.txt)
EOF
" 2> /dev/null

El poder de estas dos soluciones es que solo obtienes unos pocos tipos de expansiones de shell que no ocurren normalmente $((...)), `...` y $(...), aunque la barra invertida es una carácter de escape aquí, pero no tiene que preocuparse de que el análisis tenga un error y funciona bien con varias líneas.

plockc avatar Jun 10 '2013 19:06 plockc

¡ Sed !

Plantilla.txt dada:

El número es ${i}
La palabra es ${palabra}

solo tenemos que decir:

sed -e "s/\${i}/1/" -e "s/\${word}/dog/" template.txt

Gracias a Jonathan Leffler por el consejo de pasar múltiples -eargumentos a la misma sedinvocación.

user avatar Jan 06 '2009 08:01 user

Usar /bin/sh. Cree un pequeño script de shell que establezca las variables y luego analice la plantilla utilizando el propio shell. Así (edite para manejar las nuevas líneas correctamente):

Plantilla de archivo.txt:

the number is ${i}
the word is ${word}

Archivo script.sh:

#!/bin/sh

#Set variables
i=1
word="dog"

#Read in template one line at the time, and replace variables (more
#natural (and efficient) way, thanks to Jonathan Leffler).
while read line
do
    eval echo "$line"
done < "./template.txt"

Producción:

#sh script.sh
the number is 1
the word is dog
gnud avatar Jan 06 '2009 07:01 gnud