用 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
.
演示
我正在尝试根据命令“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
.
演示