用 jq 创建 JSON

Create JSON with jq

我正在尝试根据命令“lsb_release”

的结果使用 jq 创建一个 JSON 文件

我做了什么:

if [ -x "$(command -v lsb_release)" ]; then
    lsb_release -a  | jq  --raw-input 'split("\t") | { (.[0]) : .[1] }' > ubuntu_release.json
fi

结果是

{
  "Distributor ID:": "Ubuntu"
}

{
  "Description:": "Ubuntu 20.04.3 LTS"
}

{
  "Release:": "20.04"
}

{
  "Codename:": "focal"
}

但我想要结果

[
    {
      "Distributor ID:": "Ubuntu"
    },
    {
      "Description:": "Ubuntu 20.04.3 LTS"
    },
    {
      "Release:": "20.04"
    },
    {
      "Codename:": "focal"
    }
]

任何人都可以帮助我吗? :)

通常,当我们想从输入流创建一个数组时,我们可以使用--slurp/-s。但是当与 --raw-input/-R 结合使用时,这会导致整个输入作为单个字符串(包含换行符)提供。

也可以使用 --null-input/-n[ inputs | ... ] 来实现吸食。这适用于文本文件。

jq -nR '[ inputs | split("\t") | { (.[0]) : .[1] } ]'

Demo 在 jqplay


也就是说,我想您会发现以下输出格式更有用:

{
  "Distributor ID": "Ubuntu",
  "Description": "Ubuntu 20.04.3 LTS",
  "Release": "20.04",
  "Codename": "focal"
}

这可以通过简单地添加 | add.

来实现
jq -nR '[ inputs | split(":\t") | { (.[0]) : .[1] } ] | add'

Demo 在 jqplay

也可以用reduce.

jq -nR 'reduce ( inputs | split(":\t") ) as [ $k, $v ] ( {}; . + { ($k): $v } )'

Demo 在 jqplay

过滤器

reduce (inputs / ":\t") as [$key, $value] ({}; .+{($key): $value})

输入

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

输出

{
  "Distributor ID": "Ubuntu",
  "Description": "Ubuntu 20.04.3 LTS",
  "Release": "20.04",
  "Codename": "focal"
}

请注意 $key 的每一行inputs$value 的每一行都被处理并且 合并 reduce.

演示

https://jqplay.org/s/ZBvKf6vQ0F