首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jq输出jq输出回车?

jq输出jq输出回车?
EN

Stack Overflow用户
提问于 2018-10-03 05:07:47
回答 3查看 5.9K关注 0票数 1

请随意编辑标题;不知道怎么写。我正在尝试将shell输出转换为我正在为工作编写的报告系统的JSON数据。快速提问,无论我做什么,当我在slurp模式下接受原始输入并输出JSON时,数组中的最后一项是空的("")。我觉得这是我遇到的某个菜鸟jq问题,但我想不出怎么说这个问题。无论我在shell和管道上运行到jq的哪个命令,这种情况似乎都会发生。

代码语言:javascript
复制
# rpm -qa | grep kernel | jq -R -s 'split("\n")'
[
  "kernel-2.6.32-504.8.1.el6.x86_64",
  "kernel-firmware-2.6.32-696.20.1.el6.noarch",
  "kernel-headers-2.6.32-696.20.1.el6.x86_64",
  "dracut-kernel-004-409.el6_8.2.noarch",
  "abrt-addon-kerneloops-2.0.8-43.el6.x86_64",
  "kernel-devel-2.6.32-358.11.1.el6.x86_64",
  "kernel-2.6.32-131.4.1.el6.x86_64",
  "kernel-devel-2.6.32-696.20.1.el6.x86_64",
  "kernel-2.6.32-696.20.1.el6.x86_64",
  "kernel-devel-2.6.32-504.8.1.el6.x86_64",
  "libreport-plugin-kerneloops-2.0.9-33.el6.x86_64",
  ""
]

任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-03 05:19:52

每一行都以换行符结尾。要么删除最后一个换行符,要么忽略数组末尾的空元素。

代码语言:javascript
复制
vnix$ printf 'foo\nbar\n' |
> jq -R -s '.[:-1] | split("\n")'
[
  "foo",
  "bar"
]

vnix$ printf 'foo\nbar\n' |
> jq -R -s 'split("\n")[:-1]'
[
  "foo",
  "bar"
]

表示法x[:-1]检索删除最后一个元素的字符串或数组x的值。这叫做“切片符号”。

为了说明这一点,如果使用字符串"foo\n"并在换行符上拆分,则可以在换行符之前得到"foo",在之后得到""

为了使这个真正的健壮,也许修剪最后一个字符,只有当它真的是一个换行符。

代码语言:javascript
复制
vnix$ printf 'foo\nbar\n' |
> jq -R -s 'sub("\n$";"") | split("\n")'
[
  "foo",
  "bar"
]

vnix$ printf 'foo\nbar' |
> #  notice, no final ^ newine
> jq -R -s 'sub("\n$";"") | split("\n")'
[
  "foo",
  "bar"
]
票数 4
EN

Stack Overflow用户

发布于 2018-10-03 05:52:46

假设您可以访问JQ1.5或更高版本,则可以使用inputs完全和经济地规避这个问题

代码语言:javascript
复制
jq -nR '[inputs]'

只需确保包含-n选项,否则第一行将丢失。

票数 3
EN

Stack Overflow用户

发布于 2018-10-03 06:05:05

您也可以使用

代码语言:javascript
复制
rpm -qa | grep kernel | jq -R . | jq -s .

才能得到预期的结果。

请参阅https://github.com/stedolan/jq/issues/563

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52620027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档