11

我有以下文件

[
  {
    "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"

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

4

2 回答 2

15

您提供的信息中有几个问题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
于 2017-05-19T06:43:13.840 回答
0

如果 .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
于 2017-05-19T13:31:03.367 回答