在命令行中从变量中提取数据

在命令行中从变量中提取数据

我有两个变量 $dc_list 和 $TEST_VENUE 。如果我在 bash 中 echo

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

echo $TEST_VENUE
standby-production-dc

现在我需要从 dc_list 获取 TEST_VENUE 的值。

我试过这个:

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

但如果我硬编码,

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

但我想先用sed来实现。对此有什么建议吗?

答案1

为了巴什您可以使用参数扩展

result=${dc_list#*$TEST_VENUE\":\"}
result=${result%%\"*}

答案2

这对我有用:

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

但是,我的建议是不要使用它,特别是如果格式发生$dc_list变化。
我建议使用 json 解析器。我会用类似的东西PHP 函数 json_decode()但显然还有其他选择 - 也许 python 也有一些好的东西。

这个使用 PHP 的示例json_decode()对我来说很有效,并且更加可靠,当然它假设您有一个可用的 PHP cli SAPI。
您可以直接在 shell 脚本中使用此代码,我使用 zsh 进行了测试,但我希望它也适用于 bash。

<< 'EOF' php -- "$dc_list" "$TEST_VENUE"
<?php
$a = json_decode($argv[1]);
echo $a->{$argv[2]} . PHP_EOL;
EOF

答案3

对于 JSON 数据,请使用 JSON 解析器,例如

$ jq -r ".[\"$TEST_VENUE\"]" <<< "$dc_list" 
sc-tx2

相关内容