这是我的JSON test.json
文件:
[
{
"name": "nodejs",
"version": "0.1.21",
"apiVersion": "v1"
},
{
"name": "nodejs",
"version": "0.1.20",
"apiVersion": "v1"
},
{
"name": "nodejs",
"version": "0.1.11",
"apiVersion": "v1"
},
{
"name": "nodejs",
"version": "0.1.9",
"apiVersion": "v1"
},
{
"name": "nodejs",
"version": "0.1.8",
"apiVersion": "v1"
}
]
当我使用 max_by
时,jq
返回 0.1.9
而不是 0.1.21
可能是由于引用的值:
cat test.json | jq 'max_by(.version)'
{
"name": "nodejs",
"version": "0.1.9",
"apiVersion": "v1"
}
如何获取版本=0.1.21的元素?
版本比较在jq
中不受现成支持。您需要使用按.
分割的字段
jq 'sort_by(.version | split(".") | map(tonumber))[-1]'
split(".")
从.version
中获取字符串并创建一个字段数组,即 0.1.21
成为[ "0", "1", "21"]
数组,map(tonumber)
采用输入数组并将字符串元素转换为数字数组。
sort_by()
函数对从上一步生成的数组中的每个元素进行索引比较,并按升序与包含版本的对象进行排序,0.1.21
在最后。[-1]
表示法是从此排序数组中获取最后一个对象。
以下是使用 jq 的更一般答案的改编如何使用 JFrog CLI 按版本号对 Artifactory 软件包搜索结果进行排序?
def parse:
[splits("[-.]")]
| map(tonumber? // .) ;
max_by(.version|parse)
作为不太健壮的单行:
max_by(.version | [splits("[.]")] | map(tonumber))