Processar JSON, contendo novas linhas, com JQ e bash [closed]

1

Eu recebo um JSON com uma chamada curl semelhante à seguinte:

output="$(curl -s "$api_url")"

Esta saída está no formato JSON e precisa ser processada pelo jq, parece o seguinte:

{
    "test": "Hello\nThere!"
}

Neste momento, estou usando a seguinte combinação de pipe echo para fazer o jq funcionar:

test="$(echo "$output" | jq -r ".test")"

No entanto, isso não funcionará para a entrada de exemplo, pois contém novas linhas nos erros JSON e JQ com parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 2, column 6

Existe alguma maneira de alterar os dados para que o jq possa entendê-los?

    
por Jonas Dellinger 01.10.2018 / 09:15

1 resposta

2

Então a entrada literal é esta:

$ output='{
>     "test": "Hello
> There!"
> }'
$ echo "$output" | jq -r ".test"
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 3, column 7

JSON não possui sequências de várias linhas. Então, se você está obtendo este valor literal da API, é um bug da API, e deve ser corrigido no servidor.

Como você diz que a API realmente retorna algo como {"test": "Hello\nThere!"} , o problema deve ser com seus comandos, porque isso funciona com o jq 1.5 no Bash 4.4.23:

$ output='{"test": "Hello\nThere!"}'
$ echo "$output" | jq -r ".test"
Hello
There!

eval (que é ruim), echo -e e outros comandos especiais podem resultar na decodificação de caracteres com escape. Tente usar printf '%s' "$output" . Mais informações sobre o seu ambiente seriam necessárias para depurar isso.

    
por 01.10.2018 / 09:30

Tags