Avalie a expressão capturada dentro da substituição em sed

0

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 é:

  1. Encontrar modelo no arquivo
  2. Capture um rótulo dele (em PASS__LBL__ é LBL)
  3. Substituir modelo por env. variável ($ LBL)

Como posso avaliar essas variáveis dinâmicas em sed ou é irreal?

    
por ZhukovRA 29.01.2018 / 13:00

3 respostas

2

Perl pode acessar variáveis env através do hash% ENV:

LABELONE=pass1 LABELTWO=pass2 perl -pe 's/PASS__(.+)__/$ENV{$1}/' -- tst.txt
    
por 29.01.2018 / 13:14
0

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.

    
por 29.01.2018 / 13:28
0

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.

    
por 29.01.2018 / 13:23