¿Cómo reemplazar los marcadores de posición ${} en un archivo de texto?
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.
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.
¡ 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 -e
argumentos a la misma sed
invocación.
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