Hilo antiguo, pero este es un problema recurrente. Aquí hay una solución usando bash mapfile
:
mateus@mateus:/tmp$ cat input.txt
a = $a
b = $b
mateus@mateus:/tmp$ echo a=$a, b=$b
a=1, b=2
mateus@mateus:/tmp$ function subst() { eval echo -E "$2"; }
mateus@mateus:/tmp$ mapfile -c 1 -C subst < input.txt
a = 1
b = 2
Bash builtin mapfile
llama a la función definida por el usuario subst
(consulte las opciones -C / -c) en cada línea leída del archivo de entrada input.txt
. Dado que la línea contiene texto no escapado, eval
se utiliza para evaluarlo y echo
el texto transformado en stdout (-E evita que se interpreten caracteres especiales).
En mi humilde opinión, esta es una solución mucho más elegante que cualquier solución basada en sed / awk / perl / regex.
Otra posible solución es usar la propia sustitución de shell. Esto parece una forma más "portátil" que no se transmite en mapfile
:
mateus@mateus:/tmp$ EOF=EOF_$RANDOM; eval echo "\"$(cat <<$EOF
$(<input.txt)
$EOF
)\""
a = 1
b = 2
Tenga en cuenta que usamos $EOF
para minimizar el documento here-conflict de cat con contenido input.txt
Ambos ejemplos de: https://gist.github.com/4288846
EDITAR: Lo sentimos, el primer ejemplo no maneja los comentarios y el espacio en blanco correctamente. Trabajaré en eso y publicaré una solución.
EDIT2: Fix double $ RANDOM eval
$RANDOM
generará números posiblemente diferentes? Cuando escriboecho $RANDOM $RANDOM
en una terminal, obtengo dos números diferentes.Como se describe en el mismo hilo en http://www.issociate.de/board/post/281806/sed_replace_by_enviroment_var_content.html , la solución "adecuada" sería la siguiente:
eval
El enfoque está bien, pero tiende a fallar en los archivos XML, por ejemplo.fuente
Se puede hacer con script (por ejemplo, el nombre del archivo es
expand.sh
):El guión puede llamarse así:
- http://www.issociate.de/board/post/281806/sed_replace_by_enviroment_var_content.html
fuente
echo "$line"
. @ andersonbd1: ¿cuál es el contexto de los paréntesis?read -r
.Aquí está mi solución propuesta:
\002
se puede reemplazar con cualquier carácter o cadena que no ocurra en el archivo. Para eliminar cualquier aparición del carácter delimitador en el archivo de entrada:Esta solución parece resolver la mayoría de los problemas, pero es notablemente vulnerable a la inyección de comandos en el archivo de plantilla a través de
$(command)
directivas.fuente
$"xxx"
puede ser una manera fácilentonces "$ b" es el texto expandido
fuente
Esto define una función de shell que usa python para imitar la expansión de shell básica de las variables $ {name}. Lo uso para expandir las variables bash incrustadas en los scripts sql. Dado que mi archivo no es un verdadero archivo bash, no puede usar el incorporado eval () bash
fuente
myvar
ymyvalue
qué hacer con algo? (2) No necesitas decirlo${1}
; se puede decir$1
.