com zsh
:
print -r -- "${(e)$(<reports/my_report.sql)}"
Com qualquer shell parecido com o Bourne (incluindo zsh
):
eval "cat << EOF
$(cat reports/my_report.sql)
EOF"
Ambos expandirão todos os '...'
, $(...)
, $((...))
, $[...]
, $xxx
e ${xxx}
. Então, você precisará escapar dos caracteres dólar e backtick que não deseja expandir.
Além disso, para o segundo, o conteúdo do arquivo não deve conter uma linha que consiste nos três caracteres EOF
(que para SQL
não deve ser um problema).
Como alternativa, você pode fazer:
perl -pe 's/\${(\w+)}/$ENV{$1}/g' reports/my_report.sql
Você precisará export
das variáveis, para perl
estar ciente delas.
Por que sua solução não funciona e não está nem perto de funcionar, você pode executá-la depois de set -x
para ver o que está acontecendo:
$ echo "SELECT ${sql_year} AS year" | sed -e "s/\(\${[a-zA-Z_]*}\)/'eval "echo ''"'/"
+ echo 'SELECT 2013 AS year'
++ eval 'echo '\'''\'''
+++ echo ''
+ sed -e 's/\(${[a-zA-Z_]*}\)//'
SELECT 2013 AS year
Usando aspas duplas, o shell expande as variáveis e a substituição de comandos antes de chamar echo
e sed
. Então, você realmente correu:
echo 'SELECT 2013 AS year' | sed -e 's/\(${[a-zA-Z_]*}\)//'
sed
não pode executar o código. Portanto, mesmo se você tivesse usado aspas simples, sed
não teria expandido o '...'
.