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

use*_*755 6 bash json newline output-formatting jq

我有以下文件

[
  {
    "id": 1,
    "name": "Arthur",
    "age": "21"
  },
  {
    "id": 2,
    "name": "Richard",
    "age": "32"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

$ jq '.[] | .name' test
"Arthur"
"Richard"
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

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

$ ./script.sh
"Arthur" "Richard"
Run Code Online (Sandbox Code Playgroud)

我想在每次迭代时打破,类似于它在命令行上的工作方式.

请帮忙

Ini*_*ian 8

您提供的信息中有几个问题。该jq过滤器.[] | .login, .id,你声称上不会产生输出jq-1.5。为了你的原始JSON

{  
   "login":"dmaxfield",
   "id":7449977
}
{  
   "login":"stackfield",
   "id":2342323
}
Run Code Online (Sandbox Code Playgroud)

它将产生四行输出,

jq -r '.login, .id' < json
dmaxfield
7449977
stackfield
2342323
Run Code Online (Sandbox Code Playgroud)

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

jq -r '"\(.login), \(.id)"' < json
dmaxfield, 7449977
stackfield, 2342323
Run Code Online (Sandbox Code Playgroud)

而且,如果您觉得存储在变量中的输出不起作用。当您尝试在shell中打印变量时,可能是因为缺少双引号。

jqOutput=$(jq -r '"\(.login), \(.id)"' < json)
printf "%s\n" "$jqOutput"
dmaxfield, 7449977
stackfield, 2342323
Run Code Online (Sandbox Code Playgroud)

这样,shell 不会吞噬命令输出中嵌入的新行。


对于更新的JSON(与旧的相比,新的完全是新的),您要做的就是

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