我有2个文件
file_one.json
{
"releases": [
{
"name": "bpm",
"version": "1.1.5"
},
{
"name": "haproxy",
"version": "9.8.0"
},
{
"name": "test",
"version": "10"
}
]
}
和file_two.json
{
"releases": [
{
"name": "bpm",
"version": "1.1.6"
},
{
"name": "haproxy",
"version": "9.8.1"
},
{
"name": "test",
"version": "10"
}
]
}
在文件2中,版本已更改,我需要回显新的更改。 我已使用以下命令查看更改:
diff -C 2 <(jq -S . file_one.json) <(jq -S . file_two.json)
但是比我需要将输出格式化为这样的东西。 我需要输出文本:
The new versions are:
bpm 1.1.6
haproxy 9.8.1
答案 0 :(得分:3)
您也许可以使用以下myemail@gmail.com
命令:
jq
它首先合并两个releases数组,按名称对元素进行分组,然后统一结果数组的元素,使用单个元素(两个文件之间相同的版本)删除数组,然后将数组映射到它们最大的元素(按版本),最后格式化它们以供显示。
您可以try it here。
一些特殊性可能会使此解决方案不适用于您:
jq --slurp -r 'map(.releases) | add
| group_by(.name)
| map(unique | select(length > 1) | max_by(.version))
| map("\(.name) : \(.version)") | join("\n")'
file_one.json file_two.json
> 1.1.5
,1.1.20
被认为大于5
)。这可能是固定的,但可能不会出现问题,具体取决于您的版本控制方案。根据注释中更新的请求进行编辑:以下2
命令将输出在第一个文件和第二个文件之间更改的版本。它很好地处理了降级,并在某种程度上处理了第二个文件中已出现或消失的产品(尽管无论它是已出现还是已消失的产品始终将版本显示为jq
)。
version --> null
您可以try it here。