Eu tenho esses dados JSON que se parecem com isso:
[
{
"loginId": "7638749",
"customerprofileDetails": {
"securityQuestions": [
"What is your favorite sports team?",
"What is your favorite song?",
"Who is your favorite artist?"
]
}
}
]
Eu tenho um script onde passo esse arquivo como o primeiro argumento. O script fica assim:
for json in `cat $PWD/$1 | jq -cr '.[]'` ; do
echo "$json"
done
Por algum motivo, quando executo este script, ele gera isso:
> fileFromJson.sh tmp2.json
{"loginId":"7638749","customerprofileDetails":{"securityQuestions":["What
is
your
favorite
sports
team?","What
is
your
favorite
song?","Who
is
your
favorite
artist?"]}}
Por que essas novas linhas estão lá e o que está causando esse problema? Quando eu apenas executo cat $PWD/tmp2.json | jq -cr '.[]'
, ele imprime em uma linha. Estou usando o MacOS se isso importa.
A substituição de comando sem aspas
`cat $PWD/$1 | jq -cr '.[]'`
faz o seguinte:cat $PWD/$1 | jq -cr '.[]'
. Que por sinal é uma maneira muito complicada de escreverjq -cr '.[]' <"$1"
, exceto que essa variante não quebra se$1
contiver determinados caracteres especiais ou for um caminho absoluto.As etapas 2 e 3 são coloquialmente conhecidas como “operador split+glob” e isso quase nunca é o que você deseja . Sempre use aspas duplas em torno de substituições de variáveis e comandos, a menos que você saiba exatamente por que precisa deixar de fora as aspas .
Para processar um arquivo linha por linha no shell, use um
while read
loop:Mas você pode ser melhor canalizar em alguma outra ferramenta. Os shells não são bons para processar grandes quantidades de dados de string sozinhos.
Por padrão,
echo
sempre gera uma nova linha à direita.Você pode passar o
-n
argumento paraecho
para impedir que isso aconteça.De
man echo
:Editar:
O "problema" aqui não está no seu
cat $PWD/$1 | jq -cr '.[]'
comando, está naecho
própria linha, ou mais precisamente, nofor
loop. Com ofor
loop, você está dividindo o que está passando para ele (a saída dojq
comando) palavra por palavra.Então, essencialmente, você está passando cada string separada por um espaço em branco um por um para o comando echo, que por padrão adicionará uma nova linha à direita toda vez que for executado.