Esa línea de comando ejecutaría get_env '\1'
en una sustitución de comando y pegaría su salida en la línea de comando de sed
. Probablemente debería obtener un error al respecto, ya que \1
no es un nombre válido para una variable.
Podrías usar Perl y s/\{\?([a-z]+)\}/$ENV{$1}/
para hacer eso; %ENV
es un hash que contiene las variables de entorno:
$ export name=you
$ echo "hello {?name}" | perl -pe 's/\{\?([a-z]+)\}/$ENV{$1}/'
hello you
(GNU sed tiene el comando e
para ejecutar programas externos, pero utiliza todo el espacio de patrones, no solo la parte coincidente, por lo que no parece encajar muy bien aquí.)
Puramente en Bash, si insistes(setvar.sh
):
#!/bin/bash
while IFS= read -r line ; do
while [[ $line =~ ^(.*)(\{\?[a-zA-Z0-9_]+\})(.*)$ ]] ; do
varname=${BASH_REMATCH[2]}
varname=${varname#"{?"}
varname=${varname%\}}
printf -v line "%s%s%s" "${BASH_REMATCH[1]}" "${!varname}" "${BASH_REMATCH[3]}"
done
printf "%s\n" "$line"
done < "${1-/dev/stdin}"
$ echo 'foo {?BASH_VERSION} {?blah} bar' |blah=ABC bash setvar.sh
foo 4.4.12(1)-release ABC bar