Essa linha de comando executaria get_env ''
em uma substituição de comando e colaria sua saída na linha de comando de sed
. Provavelmente, você deve receber um erro sobre isso, pois não é um nome válido para uma variável.
Você poderia usar Perl e s/\{\?([a-z]+)\}/$ENV{$1}/
para fazer isso; %ENV
é um hash que contém as variáveis de ambiente:
$ export name=you
$ echo "hello {?name}" | perl -pe 's/\{\?([a-z]+)\}/$ENV{$1}/'
hello you
(o GNU sed tem o comando e
para rodar programas externos, mas ele usa todo o espaço padrão, não apenas a parte correspondente, então não parece se encaixar muito bem aqui.)
Puramente no Bash, se você insistir ( 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