![如何更新 JSON 文档中给定的环境变量值](https://linux22.com/image/192681/%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%20JSON%20%E6%96%87%E6%A1%A3%E4%B8%AD%E7%BB%99%E5%AE%9A%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%80%BC.png)
我需要使用下面的 JSON 文件作为输入,并且该文件可以包含多个变量条目。我需要在环境变量中搜索var1
orvar2
并替换下面 JSON 中的值。
{
"var1": "valueplaceholder",
"var2": "valueplaceholder"
}
我尝试了下面的命令
cat input.json | sed "s/\"\([A-Z0-9_]*\)\":\s*\"\([A-Za-z0-9_]*\)\"/\"\1\": \"$\1\"/g"
但它会创建类似的输出
{
"var1": "$var1",
"var2": "$var2"
}
如何获取变量的值?即我需要$var1
代替 text的值$var1
。
答案1
给定
$ cat file.json
{ "var1": "valueplaceholder", "var2": "valueplaceholder", "var3": "valueplaceholder" }
然后,借用该with_entries
结构如何使用jq交换对象的键和值?并利用 jq 的$ENV
数组:
$ export var1="foo" var2="bar"
$ jq 'with_entries( .value = $ENV[.key] )' file.json
{
"var1": "foo",
"var2": "bar",
"var3": null
}
或者如果您想将不匹配的变量设置为空字符串或保留原始值
$ jq 'with_entries( .value = ($ENV[.key] // "") )' file.json
{
"var1": "foo",
"var2": "bar",
"var3": ""
}
或者
$ jq 'with_entries( .value = ($ENV[.key] // .value) )' file.json
{
"var1": "foo",
"var2": "bar",
"var3": "valueplaceholder"
}
或者,如果你想删除不存在的键
$ jq 'with_entries( .value = ($ENV[.key] // empty) )' file.json
{
"var1": "foo",
"var2": "bar"
}