jq 操作后返回完整结果

jq 操作后返回完整结果

我正在向 JSON 字符串添加属性

result=$(jq -c ".docs[$docIndex] + { \"value\": \"value\" }"<<<"$fileContent")

里面的JSON在$fileContent哪里

{
    "docs": [
        {
            "id": 123
        },
        {
            "id": 456
        },
        {
            "id": 678
        },
        ...
    ]
}

$result但我手术后里面的东西是{"id:123", "value":"value"}。如何返回完整输出?我想要的是结果变成

{
    "docs": [
        {
            "id": 123,
            "value": "value"
        },
        {
            "id": 456
        },
        {
            "id": 678
        },
        ...
    ]
}

答案1

jq 本质上是一个过滤器,因此.docs[0]将脚本其余部分可用的数据限制为它所选择的数据。在程序结束时,输出流中的所有内容。因此,只能+ { ... }看到一个对象,并且它的输出被用作整个程序的输出。

如果你想调整您选择的元素之一,使用+=,这是一个别名更新赋值运算符|= . + ...

jq '.docs[1] += { "value": "value" }' < ...

您可以等效地编写脱糖的

jq '.docs[1] |= . + { "value": "value" }' < ...

无论哪种情况,它都会将当前值(.开始时的值)替换为将您描述的更改应用于所选元素的结果。该新值通过管道继续执行,在本例中立即到达输出级。

相关内容