【问题标题】:JQ checking for values in an array given as a parameterJQ 检查作为参数给出的数组中的值
【发布时间】:2021-09-14 02:14:28
【问题描述】:

我有一个简单的 JQ 过滤器来根据“键”更新数组中的一些值,例如这是我的输入:

[
    {
        "Key": "IDontCare",
        "Value": "something"
    },
    {
        "Key": "Tag1",
        "Value": "123-456"
    },
    {
        "Key": "Tag2",
        "Value": "121-717"
    }
]

我想将两个标签都更新为一个新值(两者的值相同),所以我有这个命令,它有效:

jq --arg NEW_VALUE '987-654' \
    '[.[] |= if(.Key=="Tag1" or .Key=="Tag2") then (.Value=$NEW_VALUE) else . end]'

但是,我想在不同的运行中更新不同的标签,并希望将它们作为另一个参数传递。但不确定如何更改if() 以从参数中查找标签。

我尝试过这样的方法,但这显然不是正确的方法:

jq --argjson TAGS '["Tag1","Tag2"]' --arg NEW_VALUE '987-654' \
    '[.[] |= if(.Key|in($TAGS)) then (.Value=$NEW_VALUE) else . end]'

有什么想法吗?

【问题讨论】:

    标签: arrays json jq whitelist


    【解决方案1】:

    您可以使用 IN 来查看值是否是列表的一部分,并使用 select as 使用更简单的更新分配

    jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
       map(select( .Key | IN($TAGS[] ) ).Value |= $NEW_VALUE )' json
    

    【讨论】:

    • 太好了! JQ 1.5 是否有类似的简洁方法?它说jq: error: IN/1 is not defined at <top-level>
    • @MLu: IN 就是这个简单的函数——你可以用它来代替——github.com/stedolan/jq/blob/master/src/builtin.jq#L274
    • 所以我将其更改为select( .Key | any($TAGS[] == .; .) ),但这在 1.5 中仍然不起作用。不过,同样的方法在 1.6 中仍然有效。
    • @MLu:您可以从这里采用一种方法 - stackoverflow.com/q/43259563/5291015
    • 我之前看到过这个答案,但仍然无法解决。将我们的管道更新到 jq 1.6,这会更容易。我承认 jq 对我来说是我在没有太多理解的情况下复制和粘贴的神奇事物之一。我知道我知道...
    【解决方案2】:

    使用 jq 1.5 或更高版本

    jq --arg NEW_VALUE '987-654' --argjson TAGS '["Tag1","Tag2"]' '
       def IN(s): first((s == .) // empty) // false;
       map(if .Key | IN($TAGS[]) then .Value = $NEW_VALUE else . end)
    '
    

    (使用 jq 1.6,您显然可以省略IN/1 的定义。)

    使用 jq 1.4 或更高版本

    jq --arg NEW_VALUE '987-654' --arg TAGS '["Tag1","Tag2"]' '
       ($TAGS|fromjson) as $TAGS
       | map(if [.Key == $TAGS[]]|any then .Value = $NEW_VALUE else . end)
    ' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 2022-11-29
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      相关资源
      最近更新 更多