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]スクリプトの残りの部分で利用可能なデータを選択した項目に制限します。プログラムが終了すると、ストリームの内容がすべて出力されます。したがって、+ { ... }1つのオブジェクトのみが表示され、その出力はプログラム全体の出力として使用されます。

欲しいなら調整選択した要素の1つ、使用+=、これはエイリアスです。代入演算子の更新|= . + ...:

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

Desugarizedを同等に書くことができます。

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

.どちらの場合も、現在の値(開始値)を選択した要素に記載されている変更を適用した結果に置き換えます。この新しい値はパイプラインを介して引き続き実行され、その場合は出力フェーズにすぐに到達します。

おすすめ記事