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)
我想在每次迭代时打破,类似于它在命令行上的工作方式.
请帮忙
您提供的信息中有几个问题。该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)