如何在 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 的每次迭代中获取换行符的主要内容,如果未能解决你的问题,请参考以下文章

怎么在jq中的html()中添加换行或者空格符

如何停止获取错误并保留数据:缺少换行符:在位置 116 发现意外字符 0x31

Python如何在包含' n'的行中打印带有换行符的文本

如何在为 Android 共享提供的消息中获取换行符

如何从 PHP 开始新的 HTML 行?

如何获取 Mandrill/Mailchimp 模板以在合并标签中保留换行符