jQuery的原始JSON输出回车?

时间:2018-10-03 05:07:48

标签: json bash shell jq

随时编辑标题;不知道如何措辞。我正在尝试将外壳输出转换为我正在编写的报告系统的JSON数据。快速问题,无论我做什么,当我在slurp模式下获取原始输入并输出JSON时,数组中的最后一项为空(“”)。我觉得这是我遇到的某种新手jq问题,但无法弄清楚该问题的措辞。无论我在shell上执行什么命令并将其传递到jq上,这似乎都发生了:

# 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",
  ""
]

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

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的值。这称为"slice notation".

只需说明一下,如果您使用字符串"foo\n"并在换行符上分割,您将从换行符之前得到"foo",在换行符之后得到""

要使其真正可靠,请仅在最后一个字符确实是换行符时才修剪它。

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"
]

答案 1 :(得分:3)

假设您可以使用jq 1.5或更高版本,则可以使用inputs完全经济地解决该问题:

jq -nR '[inputs]'

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

答案 2 :(得分:1)

您也可以使用

rpm -qa | grep kernel | jq -R . | jq -s .

以获得所需的结果。

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