【问题标题】:Taking name of field to update (not just value) from variable in calling JQ在调用 JQ 时从变量中获取要更新的字段名称(不仅仅是值)
【发布时间】:2018-07-26 18:41:18
【问题描述】:

我需要支持所有变量以将更改推送到 JSON

changeField=.one.aaa
changeValue=new-val

这行得通:

jq --arg changeValue $changeValue ".one.aaa = \"$changeValue\"" some.json

这不是:

jq --arg changeField $changeField --arg changeValue $changeValue "$changeField = \"$changeValue\"" some.json

我已经尝试了所有[{( Google 向我展示的组合,但没有任何效果。我在这里错过了什么?

【问题讨论】:

  • 您的 JSON 实际上是什么样的?是带有{".one.aaa": "old-value"} 的字典吗?还是{"one": {"aaa": "old-value"}}?这是一个minimal reproducible example 有帮助的地方,而不是依靠人们对您的数据做出假设。

标签: json bash jq


【解决方案1】:

如果您希望将点视为嵌套分隔符

这意味着让 JQ 将您的 changeField 内容解析为代码;确保它来自受信任的来源。 (相比之下,changeValue 纯粹是作为代码带外数据传递的,无论其内容如何,​​都可以防止注入攻击。

inputJson='{"one": {"aaa": "old-val"}}'
changeField=.one.aaa
changeValue=new-val

jq --arg changeValue "$changeValue" "$changeField"'=$changeValue' <<<"$inputJson"

...正确发出:

{
  "one": {
    "aaa": "new-val"
  }
}

如果你想让点是文字

inputJson='{".one.aaa": "old-val"}'
changeField=.one.aaa
changeVal=new-val
jq --arg changeField "$changeField" \
   --arg changeValue "$changeValue" \
   '.[$changeField]=$changeValue' <<<"$inputJson"

...正确发出:

{
  ".one.aaa": "new-val"
}

请注意,当我们通过jq --arg 传递参数时,我们在后面的查询中使用单引号引用它以使引用成为shell 的文字 字符串,因此语法为@987654328 @。

相比之下,当我们希望数据(而不是对它的引用)与jq 的语法相同时,我们在shell 层用双引号传递了变量的扩展,因此在jq 将其解析为代码之前它已被扩展。

【讨论】:

  • 啊,太简单了,我简直不敢相信我错过了!谢谢!!
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 2015-06-22
  • 2019-04-11
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多