Perl pode acessar variáveis env através do hash% ENV:
LABELONE=pass1 LABELTWO=pass2 perl -pe 's/PASS__(.+)__/$ENV{$1}/' -- tst.txt
Estou trabalhando no script de implantação e minha necessidade é substituir as credenciais do banco de dados (ou outro sistema) no arquivo de configuração.
Eu tenho arquivos PHP com credenciais como:
<?php
return [
'mysql-rw' => [
'dns' => 'mysql-rw.local',
'user' => 'local',
'password' => 'PASS__LABELONE__',
],
'mysql-ro' => [
'dns' => 'mysql-ro.local',
'user' => 'local',
'password' => 'PASS__LABELTWO__',
],
];
Além disso, tenho variáveis de ambiente Bash no servidor de IC - LABELONE
e LABELTWO
. Eu quero substituir modelos no arquivo com uma linha de comando sed
, mas tem erro ou substituição errada:
LABELONE=pass1 LABELTWO=pass2 sed -r "s/PASS__(.+)__/${!}/" tst.txt
bash: s/PASS__(.+)__/${!}/: bad substitution
Minha abordagem é:
Como posso avaliar essas variáveis dinâmicas em sed
ou é irreal?
O valor do grupo capturado (...)
de sed
expresion não pode ser processado como variável de ambiente bash , use o programa GNU awk
em vez disso:
export LABELONE="pass1"
export LABELTWO="pass2"
awk 'match($0, /PASS__([^_]+)__/, m){ sub(/PASS__[^_]+__/, ENVIRON[m[1]]) }1' testfile
A saída:
<?php
return [
'mysql-rw' => [
'dns' => 'mysql-rw.local',
'user' => 'local',
'password' => 'pass1',
],
'mysql-ro' => [
'dns' => 'mysql-ro.local',
'user' => 'local',
'password' => 'pass2',
],
];
ENVIRON
An associative array containing the values of the environment. The array indices are the environment variable names; the elements are the values of the particular environment variables.
Provavelmente não é o que você está procurando, mas se você o canaliza sequencialmente através de vários seds com correspondência explícita dos rótulos, isso funciona ... Não é elegante, é claro.
LABELONE=pass1; LABELTWO=pass2;
sed -r "s/PASS__LABELONE__/$LABELONE/" tst.txt | sed -r "s/PASS__LABELTWO__/$LABELTWO/"
É claro que isso será tedioso muito rápido se você tiver mais variáveis ou se elas forem nomeadas com outra coisa. Você provavelmente poderia fazer algo no bash em si, mas eu mesmo não consigo ver como fazer isso em uma linha de sed, infelizmente.
EDITAR: Ok, então isso funciona, assumindo que as variáveis são de fato variáveis de ambiente e você tem acesso ao envsubst
export LABLEONE=pass1
export LABELTWO=pass2
sed -r "s/PASS__(.+)__/$/g" test.txt | envsubst
No entanto, ele depende do envsubst, que é parte do gettext, eu acho. Então não sei se isso funcionaria para você? Além disso, escrevendo as variáveis reais $ LABELONE nos arquivos de configuração, você pode se livrar do sed completamente e apenas usar envsubst. Pessoalmente eu gosto do script perl mencionado em outro comentário, então eu votei para isso.