我有一个json文件:
{
"rec_9M":
{
"id":"000",
"rec_E":
[
{
"id":"111"
} ,
{
"id":"222"
}
]
}
}
我需要更改值rec_9M.rec_E[].id,但我需要为此使用通用bash函数,该函数可用于更改不同级别上的值(rec_9M.id或rec_9M.rec_E[].files[]。 id)
我尝试过:
VAR=rec_9M.rec_E[]
NUM=555
echo $(cat config.json) | jq --arg VAR_I $VAR --arg NUM_I $NUM '.[$VAR_I].id = $NUM_I' > config_t.json
cat config_t.json
{
"rec_9M": {
"id": "000",
"rec_E": [
{
"id": "555"
},
{
"id": "555"
}
]
}
}
{
"rec_9M": {
"id": "000",
"rec_E": [
{
"id": "111"
},
{
"id": "222"
}
]
},
"rec_9M.rec_E[]": {
"id": "555"
}
}
如果密钥是硬编码的 - 一切正常。:
echo $(cat config.json) | jq --arg VAR_I $VAR --arg NUM_I $NUM '.rec_9M.rec_E[].id = $NUM_I' > config_t.json
我还尝试了在 jq 中使用 VAR_I 与引号和特殊符号的任何组合,例如“($VAR_I)”。结果是一样的还是jq解析错误。
也许有人知道解决方案吗?
getpath()
基于变量(或其他字符串)提取输入 JSON 的路径:
$ jq --arg path "rec_9M.rec_E" --arg i 555 'getpath($path | split("."))[] += {id: $i}' config.json
{
"rec_9M": {
"id": "000",
"rec_E": [
{
"id": "555"
},
{
"id": "555"
}
]
}
}
注意将尾随
[]
离开路径。
echo $(cat config.json)
有很多问题。 jq
以JSON文档的文件名作为参数;用那个。或者,如果您打算将 cat config.json | jq ...
部分替换为更复杂的内容(例如 cat
请求或输出 JSON 的其他命令),那么甚至无用地使用 Cat(例如 curl
)作为示例也可以...但不要组合与 echo
一起使用。除了引入不必要的步骤之外,如果您的 shell 版本的 echo
执行诸如用文字换行符替换 \n
之类的操作,那么如果 JSON 中的字符串中存在转义序列,它将破坏其他所有内容。