如何在 jq 中的每次迭代中获取换行符

How to get newline on every iteration in jq

我有以下文件

[
  {
    "id": 1,
    "name": "Arthur",
    "age": "21"
  },
  {
    "id": 2,
    "name": "Richard",
    "age": "32"
  }
]

要同时显示登录名和 ID,我使用以下命令

$ jq '.[] | .name' test
"Arthur"
"Richard"

但是当我把它放在 shell 脚本中并尝试将其分配给一个变量时,整个输出显示在一行中,如下所示

#!/bin/bash

names=$(jq '.[] | .name' test)
echo $names

$ ./script.sh
"Arthur" "Richard"

我想在每次迭代时中断,类似于它在命令行上的工作方式。

您提供的信息中有几个问题jq 过滤器 .[] | .login, .id 不会产生您在 jq-1.5 上声明的输出。对于你原来的JSON

{  
   "login":"dmaxfield",
   "id":7449977
}
{  
   "login":"stackfield",
   "id":2342323
}

它将产生四行输出,

jq -r '.login, .id' < json
dmaxfield
7449977
stackfield
2342323

如果您有兴趣将它们并排存储,则需要进行变量插值,如

jq -r '"\(.login), \(.id)"' < json
dmaxfield, 7449977
stackfield, 2342323

如果您觉得存储在变量中的输出不起作用。这可能是因为当您尝试在 shell.

中打印变量时缺少双引号
jqOutput=$(jq -r '"\(.login), \(.id)"' < json)
printf "%s\n" "$jqOutput"
dmaxfield, 7449977
stackfield, 2342323

这样,命令输出中嵌入的新行 而不是 被 shell.

吞没了

为您更新了JSON(全新的与旧的相比),您需要做的就是

jqOutput=$(jq -r '.[] | .name' < json)
printf "%s\n" "$jqOutput"
Arthur
Richard

如果 .login 或 .id 包含可能导致问题的嵌入空格或其他字符,更可靠的方法是确保每个 JSON 值位于单独的行中。例如考虑:

jq -c .login,.id input.json | while read login ; do read id; echo login="$login" and id="$id" ; done
login="dmaxfield" and id=7449977
login="stackfield" and id=2342323