如何在 jq 的每次迭代中获取换行符
Posted
技术标签:
【中文标题】如何在 jq 的每次迭代中获取换行符【英文标题】:How to get newline on every iteration in jq 【发布时间】:2017-10-19 03:54:34 【问题描述】:我有以下文件
[
"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"
我想在每次迭代时中断,类似于它在命令行上的工作方式。
【问题讨论】:
发布您尝试存储在变量中的代码 我已经编辑了我的问题并添加了脚本 顺便说一句:单行输出的原因是您没有在echo $names
中双引号$names
,这使得shell 应用了分词。试试echo "$names"
。
【参考方案1】:
您提供的信息中有几个问题。 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
【讨论】:
@user3198755:答案已更新为您更新后的JSON
。感谢并乐于提供帮助!【参考方案2】:
如果 .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
【讨论】:
以上是关于如何在 jq 的每次迭代中获取换行符的主要内容,如果未能解决你的问题,请参考以下文章