Se você tiver Perl (mas não gettext e envsubst
), poderá fazer a substituição simples com um script curto:
$ export INSTANCE_ID=foo; export SERVICE_NAME=bar;
$ perl -pe 's/\$([_A-Z]+)/$ENV{$1}/g' < config.xml
<property>
<name>instanceId</name>
<value>foo</value>
</property>
<property>
<name>rootPath</name>
<value>/services/bar</value>
</property>
Assumi que os nomes das variáveis terão apenas letras maiúsculas e sublinhados, mas o primeiro padrão deve ser fácil de alterar conforme necessário.
$ENV{...}
referencia o ambiente que Perl vê.
Se você quiser oferecer suporte à sintaxe ${...}
ou lançar um erro em variáveis não definidas, precisará de mais algum trabalho. Um equivalente próximo de gettext
' envsubst
seria:
perl -pe 's/\$(\{)?([a-zA-Z_]\w*)(?(1)\})/$ENV{$2}/g'
Embora eu sinta que alimentar variáveis como essa através do ambiente de processo parece um pouco duvidoso em geral: você não pode usar variáveis arbitrárias nos arquivos (já que elas podem ter significados especiais), e alguns dos valores poderiam ter menos dados semi-sensíveis neles.