jq 操作后返回完整结果

MHo*_*gge 5 jq

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

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

凡JSON里面$fileContent

{
    "docs": [
        {
            "id": 123
        },
        {
            "id": 456
        },
        {
            "id": 678
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "docs": [
        {
            "id": 123,
            "value": "value"
        },
        {
            "id": 456
        },
        {
            "id": 678
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 6

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

相反,如果您想修改您选择的元素之一,请使用+=,它是更新赋值运算符|= . + ...的别名:

jq '.docs[1] += { "value": "value" }' < ...
Run Code Online (Sandbox Code Playgroud)

你可以等效地写出脱糖的

jq '.docs[1] |= . + { "value": "value" }' < ...
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,它都会将当前值(.您开始时的值)替换为将您描述的更改应用于您选择的元素的结果。该新值通过管道进行,在这种情况下立即到达输出阶段。