![在命令行中从变量中提取数据](https://linux22.com/image/92819/%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%AD%E4%BB%8E%E5%8F%98%E9%87%8F%E4%B8%AD%E6%8F%90%E5%8F%96%E6%95%B0%E6%8D%AE.png)
我有两个变量 $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