json - jq:将嵌套对象添加到 JSON

我有一个包含多个配置文件的 json 文件:

{
  "profile1": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook1"
  },
  "default": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook2"
  }
}

我想使用 jq 插入另一个配置文件“测试”,这样最终结果将是

{
  "profile1": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook1"
  },
  "default": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook2"
  },
  "test": {
    "user": "user3",
    "channel": "channel3",
    "hook": "hook3"
  }
}

我可以直接在命令行中使用:

cat filename | 
    jq  '.+  { "test": { "user": "u3", "channel" : "c3", "hook": "w3" } }'

但是当我在我的 bash 脚本中尝试它时:

cat "$CONF_FILE" | 
    jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
    '.+ { $p: { "user": $u, "channel": $c, "hook": $w } }' `

我收到以下错误:

jq: error: syntax error, unexpected ':', expecting '}' (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: error: syntax error, unexpected '}', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.+ { $p: { "user": $u, "channel": $c, "hook": $w } }
jq: 2 compile errors

我尝试用引号将变量括起来,但我得到的只是字符串 $p:

cat "$CONF_FILE" | 
    jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
    '.+ { "$p": { "user": $u, "channel": $c, "hook": $w } }' 

结果:

{
  "profile1": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook1"
  },
  "default": {
    "user": "user1",
    "channel": "channel1",
    "hook": "hook2"
  },
  "$p": {
    "user": "user3",
    "channel": "channel3",
    "hook": "hook3"
  }
}



编辑:我找到了一个临时解决方案,将对象转换为数组,编辑值(现在配置文件名称是一个值而不是键)并将数组转换回一个对象:

cat "$CONF_FILE" | 
    jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
    'to_entries | .+ [ { "key": $p, "value": { "user": $u, "channel": $c, "hook": $w } } ] | from_entries'

这看起来很粗糙,但它确实有效。我仍然希望有更好的解决方案...

最佳答案

在动态键周围使用括号:

jq --arg p "$PROFILE" --arg u "$U" --arg c "$C" --arg w "$WH" \
'. + {($p): {"user": $u, "channel": $c, "hook": $w}}' "$CONF_FILE"

https://stackoverflow.com/questions/37904796/

相关文章:

asp.net-mvc - 需要日期时间(+18 年)

intellij-idea - 为什么 IntelliJ IDEA 优先比较常量?

android - 如何从 Android Studio 中的 Assets 中读取文本文件?

android - JSONObject.put(string,string) 不工作

r - 在 R 中组合两个具有不同行数的数据框

selenium - java.lang.NoClassDefFoundError : freema

node.js - Node JS 通过 HTTP 上传文件流

python - 找到坡度最陡的点 python

javascript - 如何使滚动条长度小于父 block ?

ruby - 符号有什么用?