使用 shell 在 jSON 对象中动态添加键值对
Dynamically add key value pair in jSON object using shell
我有一个名为 version6json
的 json 对象,如下所示
{
"20007.098": {
"os_version": "6.9",
"kernel": "2.6.32-696",
"sfdc-release": "2017.08"
},
"200907.09678”: {
"os_version": "6.9",
"kernel": "2.6.32-696",
"sfdc-release": "201.7909"
},
"206727.1078”: {
"os_version": "6.9",
"kernel": "2.6.32-696.10.2.el6.x86_64",
"sfdc-release": "20097.109”
}
}
我想再添加一对键值对。键也是一个变量,值也是。 bundle_release="2019.78" and value= {"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}
现在我想要 bundle_release 作为键和值作为它的值,所以新条目将是 "2018.1006": {"release":"2018.1006","kernel":"2.6.32-754.3 .5.el6.x86_64","os":"6.10","current":true}
为此,我正在执行以下操作
echo "$version6json" | jq --arg "$bundle_release" "$value" '. + {$bundle_release: "${value}"}'
我们将不胜感激。
P.S-问题已按照peak
的建议进行编辑
首先,当按照您的方式使用变量指定键名时,变量必须用括号括起来,因此您将:
{($bundle_release): ...}
接下来,jq 变量与 shell 变量不同,应该在不引用它们的情况下指定,并且不使用 bash-isms。
第三,当设置名为 value
的 shell 变量的值时,您必须适当地引用表达式。
第四,为了简化事情,用--argjson
代替$value
。
第五,你的样本JSON不太对。修复后,以下内容将在 bash 或 bash 类环境中工作(假设您使用的是支持 --argjson
的 jq 版本):
bundle_release="1034,567"
value='{"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}'
jq --arg b "$bundle_release" --argjson v "$value" '
. + {($b): $v}' <<< "$version6json"
您没有为 --arg
选项提供足够的参数:来自手册:
--arg name value
:
This option passes a value to the jq program as a predefined variable. If you run jq with --arg foo bar
, then
$foo
is available in the program and has the value "bar"
. Note that value will be treated as a string, so
--arg foo 123
will bind $foo
to "123"
.
我有一个名为 version6json
的 json 对象,如下所示
{
"20007.098": {
"os_version": "6.9",
"kernel": "2.6.32-696",
"sfdc-release": "2017.08"
},
"200907.09678”: {
"os_version": "6.9",
"kernel": "2.6.32-696",
"sfdc-release": "201.7909"
},
"206727.1078”: {
"os_version": "6.9",
"kernel": "2.6.32-696.10.2.el6.x86_64",
"sfdc-release": "20097.109”
}
}
我想再添加一对键值对。键也是一个变量,值也是。 bundle_release="2019.78" and value= {"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true} 现在我想要 bundle_release 作为键和值作为它的值,所以新条目将是 "2018.1006": {"release":"2018.1006","kernel":"2.6.32-754.3 .5.el6.x86_64","os":"6.10","current":true}
为此,我正在执行以下操作
echo "$version6json" | jq --arg "$bundle_release" "$value" '. + {$bundle_release: "${value}"}'
我们将不胜感激。
P.S-问题已按照peak
的建议进行编辑首先,当按照您的方式使用变量指定键名时,变量必须用括号括起来,因此您将:
{($bundle_release): ...}
接下来,jq 变量与 shell 变量不同,应该在不引用它们的情况下指定,并且不使用 bash-isms。
第三,当设置名为 value
的 shell 变量的值时,您必须适当地引用表达式。
第四,为了简化事情,用--argjson
代替$value
。
第五,你的样本JSON不太对。修复后,以下内容将在 bash 或 bash 类环境中工作(假设您使用的是支持 --argjson
的 jq 版本):
bundle_release="1034,567"
value='{"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}'
jq --arg b "$bundle_release" --argjson v "$value" '
. + {($b): $v}' <<< "$version6json"
您没有为 --arg
选项提供足够的参数:来自手册:
--arg name value
:This option passes a value to the jq program as a predefined variable. If you run jq with
--arg foo bar
, then$foo
is available in the program and has the value"bar"
. Note that value will be treated as a string, so--arg foo 123
will bind$foo
to"123"
.