使用 jq 创建 JSON

Val*_*anc 3 json 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
Run Code Online (Sandbox Code Playgroud)

结果是

{
  "Distributor ID:": "Ubuntu"
}

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

{
  "Release:": "20.04"
}

{
  "Codename:": "focal"
}
Run Code Online (Sandbox Code Playgroud)

但我想要结果

[
    {
      "Distributor ID:": "Ubuntu"
    },
    {
      "Description:": "Ubuntu 20.04.3 LTS"
    },
    {
      "Release:": "20.04"
    },
    {
      "Codename:": "focal"
    }
]
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我吗?:)

ike*_*ami 8

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

--null-input还可以使用/-n和来实现吸食[ inputs | ... ]。这对于文本文件来说是理想的。

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

jqplay 上的演示


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

{
  "Distributor ID": "Ubuntu",
  "Description": "Ubuntu 20.04.3 LTS",
  "Release": "20.04",
  "Codename": "focal"
}
Run Code Online (Sandbox Code Playgroud)

这可以通过简单地添加 来实现| add

jq -nR '[ inputs | split(":\t") | { (.[0]) : .[1] } ] | add'
Run Code Online (Sandbox Code Playgroud)

jqplay 上的演示

一也可以用reduce

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

jqplay 上的演示