使用 jq 更改 json 中键的值,而该键是可变的

使用 jq 更改 json 中键的值,而该键是可变的

我有不想修改的 json 文件。问题是,json 文件中的目标键有所不同。例如这两个 json:

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "bar1": ["TEMPLATE"]
            }
        }
    }]
}

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": ["TEMPLATE"]
            }
        }
    }]
}

我想以动态方式bar1更改键的值。different1键的路径在所有 json 中都是不变的,因此使用 jq 时,它会是:

jq '.tasks[0].params.foo' my_json_file.json

我已经尝试过以下代码:

new_value="something"
jq --arg new "$new_value" '.tasks[0].params.foo[] = $new' my_json_file.json

但这样 key 的值bar1"something"代替["something"].写出来的结果是

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": "something"
            }
        }
    }]
}

而不是我想要的:

{
    "tasks": [{
        "type": "type1",
        "params": {
            "get": "something",
            "foo": {
                "different1": ["something"]
            }
        }
    }]
}

我很确定这对 jq 来说并不难,但我找不到解决方案。

答案1

关于什么 ... ?

jq --arg new "something" '.tasks[0].params.foo[] = [ $new] ' file 

答案2

您可以使用with_entries(..)并直接操作数组values[]而无需访问密钥

jq --arg new "something" '.tasks[0].params.foo |= with_entries(.value[] = $new)'

相关内容