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 }, ... ] } 

jq по сути является фильтром, поэтому .docs[0] ограничивает данные, которые остальная часть скрипта имеет доступ к тому, что она выбрала. В конце программы выводится то, что в потоке. Таким образом, + { ... } видит только один объект, а его вывод используется как результат всей программы.

Если вместо этого вы хотите изменить один из выбранных элементов, используйте += , который является псевдонимом для оператора присваивания обновлений |= . + ... |= . + ... :

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

Вы могли бы эквивалентно написать desugared

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

В любом случае он заменяет текущее значение (что было, когда вы начали) с результатом применения описанного вами изменения к выбранным вами элементам. Это новое значение продолжается по конвейеру, в этом случае сразу на выходной каскад.