jq retornando resultado completo após a operação

6

Estou adicionando uma propriedade a uma string JSON com

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

Onde o JSON dentro de $fileContent é

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

Mas o que está dentro de $result depois da minha operação é {"id:123", "value":"value"} . Como faço para retornar a saída completa? O que eu gostaria é que esse resultado se torne

{
    "docs": [
        {
            "id": 123,
            "value": "value"
        },
        {
            "id": 456
        },
        {
            "id": 678
        },
        ...
    ]
}
    
por MHogge 19.06.2017 / 10:19

1 resposta

6

jq é fundamentalmente um filtro, então .docs[0] limita os dados que o restante do script tem disponível para o que selecionou. No final do programa, o que está no fluxo é gerado. Assim, o + { ... } só vê o objeto e sua saída é usada como a saída de todo o programa.

Se, em vez disso, você quiser modificar um dos elementos selecionados, use += , que é um apelido para o operador de atribuição de atualização |= . + ... :

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

Você poderia escrever de forma equivalente o desugared

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

Em ambos os casos, ele substitui o valor atual (o que . foi quando você iniciou) com o resultado da aplicação da alteração que você descreveu para o (s) elemento (s) selecionado (s). Esse novo valor continua no pipeline, neste caso imediatamente para o estágio de saída.

    
por 19.06.2017 / 10:37

Tags