我需要这样做:(示例)
{
"jobs": [
{},
{}
],
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"foo": true,
"version": "master"
},
"service-3": {
"bar": "baz"
}
}
}这样做:
{
"services": {
"service-1": {
"version": "master"
},
"service-2": {
"version": "master"
}
}
}因此,删除除.services.*.version之外的所有内容。请帮帮忙,以我对JQ的了解,我无法处理它。
发布于 2020-11-16 11:46:18
通常,您可以使用tostream来转换表达式.services.*.version,如下所示:
reduce (tostream
| select(length==2 and
(.[0] | (.[0] == "services" and
.[-1] == "version")))) as $pv (null;
setpath($pv[0]; $pv[1]) )使用jq的流解析器
为了减少内存需求,您可以修改上面的解决方案,以使用jq的流解析器,或者像上面一样使用reduce,或者使用fromstream
jq -n --stream -f program.jq input.json其中,program.jq包含:
fromstream(inputs
| select( if length == 2
then .[0] | (.[0] == "services" and
.[-1] == "version")
else . end ) ).services.*.version.*
更广泛地解释.services.*.version,以便不要求路径的终端组件为.version,只需将.[-1] == "version"替换为:
index("version")在上面。
发布于 2020-11-16 11:17:56
如果您希望区分"version“是不存在的还是null:
{services}
| .services |= map_values(select(has("version")) | {version} )https://stackoverflow.com/questions/64851773
复制相似问题