Extraindo dados de uma variável na linha de comando

1

Eu tenho duas variáveis $ dc_list e $ TEST_VENUE. Se eu fizer eco no bash

echo $dc_list
{"active-production-dc":"sc-va1","standby-production-dc":"sc-tx2","active-integration-dc":"int-va1","standby-integration-dc":"int-tx3"}

e

echo $TEST_VENUE
standby-production-dc

Agora preciso buscar o valor de TEST_VENUE de dc_list.

Eu tentei isso:

dc=$(echo "$dc_list" | sed -e 's/^.*'"$TEST_VENUE"':"\([^"]*\)".*$//')  ---> This is not working

Mas se eu codificar,

dc=$(echo "$dc_list" | sed -e 's/^.*"standby-production-dc":"\([^"]*\)".*$//')  ---> This works.

Mas eu quero alcançar a partir do primeiro sed. Alguma sugestão para isso?

    
por user3479901 20.08.2016 / 02:16

3 respostas

1

Para bash você pode usar a expansão de parâmetros

result=${dc_list#*$TEST_VENUE\":\"}
result=${result%%\"*}
    
por 20.08.2016 / 09:59
0

Isso funciona para mim:

tr '"' _ <<< $dc_list | sed -n "s/.*${TEST_VENUE}_:_\([^_]*\).*//p"

No entanto, meu conselho seria não usar isso, especialmente se o formato do $dc_list for alterado.
Eu recomendo usar um analisador json. Eu usaria algo como a função PHP json_decode (), mas obviamente existem outras alternativas algo de bom também.

Este exemplo de uso do json_decode() do PHP funciona para mim e seria muito mais confiável, é claro que ele pressupõe que você tenha um PHP cli SAPI disponível para você.
Você poderia usar este código diretamente no seu script de shell, eu testei usando o zsh, mas eu espero que funcione para o bash também.

<< 'EOF' php -- "$dc_list" "$TEST_VENUE"
<?php
$a = json_decode($argv[1]);
echo $a->{$argv[2]} . PHP_EOL;
EOF
    
por 20.08.2016 / 04:52
0

Para dados JSON, use um analisador JSON, como

$ jq -r ".[\"$TEST_VENUE\"]" <<< "$dc_list" 
sc-tx2
    
por 21.08.2016 / 03:36