在调用JQ中从变量获取字段名称以更新(而不仅仅是值)

时间:2018-07-26 18:41:19

标签: json bash jq

我需要全面支持变量以将更改推送到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都没有显示。我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

如果要将点视为嵌套分隔符

这意味着让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传递参数时,我们在后面的查询中使用单引号对其进行引用,从而使对外壳的引用成为 literal 字符串,因此在语法上jq

相反,当我们希望数据(而不是对它的引用)与jq语法化时,我们在外壳层将变量的扩展名用双引号传递,因此在解析jq之前将其扩展了作为代码。