Por que os espaços estão ecoando como novas linhas?

0

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 eu passo nesse arquivo como o primeiro argumento. O script é assim:

for json in 'cat $PWD/$1 | jq -cr '.[]'' ; do
    echo "$json"
done

Por algum motivo, quando executo esse script, isso gera:

> 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 e o que está causando esse problema? Quando acabo de executar cat $PWD/tmp2.json | jq -cr '.[]' , imprime em uma linha. Estou usando o MacOS se isso importa.

    
por Daniel Kaplan 30.07.2018 / 20:09

2 respostas

4

A substituição de comando sem aspas 'cat $PWD/$1 | jq -cr '.[]'' faz o seguinte:

  1. Execute o comando cat $PWD/$1 | jq -cr '.[]' . Que por sinal é uma maneira excessivamente complicada de escrever jq -cr '.[]' <"$1" , exceto que essa variante não quebra se $1 contiver certos caracteres especiais ou for um caminho absoluto.
  2. Divida a sequência resultante em partes separadas por espaços em branco. Sua pergunta não é muito clara, mas você parece esperar peças separadas por novas linhas - não é isso que uma substituição sem aspas faz.
  3. Trate cada parte como um padrão curinga e, se ela corresponder a um ou mais nomes de arquivo, substitua essa parte pela lista de nomes de arquivos correspondentes.

Os passos 2 e 3 são coloquialmente conhecidos como o "operador split + glob" e quase nunca é o que você quer . Sempre use aspas duplas em torno da variável e substituições de comando, a menos que você saiba exatamente por que precisa deixar as aspas .

Para processar um arquivo linha a linha no shell, use um while read :

jq -cr '.[]' <"$1" |
  while IFS= read -r line; do
    printf '%s\n' "$line"
  done

Mas você pode ser melhor em outras ferramentas. Os shells não são bons para processar grandes quantidades de dados de strings sozinhos.

    
por 30.07.2018 / 20:33
0

Por padrão, echo sempre gera uma nova linha à direita.

Você pode passar o argumento -n para echo para evitar que isso aconteça.

De man echo :

-n do not output the trailing newline

Editar:

O "problema" aqui não está no comando cat $PWD/$1 | jq -cr '.[]' , está na própria linha echo ou, mais precisamente, no loop for . Com o loop for , você está dividindo o que está passando para ele (a saída do comando jq ) palavra por palavra.

Então, essencialmente, você está passando cada string que é separada por um espaço em branco, um a um, para o comando echo, que por padrão adicionará uma nova linha à direita toda vez que for executada.

    
por 30.07.2018 / 20:19

Tags