省略了各个级别的许多属性的示例 JSON:
{
"partitiontable": {
"label": "gpt",
"partitions": [
{
"node": "/dev/nvme0n1p1",
"start": 2048,
"size": 204801
},
{
"node": "/dev/nvme0n1p2",
"start": 208896,
"size": 4097
},
{
"node": "/dev/nvme0n1p3",
"start": 243712,
"size": 65501185
},
{
"node": "/dev/nvme0n1p4",
"start": 65810432,
"size": 3841118208
}
]
}
}
在“分区”数组的每个元素中,我想执行属性创建操作:.end = .start + .size 生成如下文档:
{
"partitiontable": {
"label": "gpt",
"partitions": [
{
"end": 206849,
"node": "/dev/nvme0n1p1",
"start": 2048,
"size": 204801
},
{
"end": 212993,
"node": "/dev/nvme0n1p2",
"start": 208896,
"size": 4097
},
{
"end": 65744897,
"node": "/dev/nvme0n1p3",
"start": 243712,
"size": 65501185
},
{
"end": 3906928640,
"node": "/dev/nvme0n1p4",
"start": 65810432,
"size": 3841118208
}
]
}
}
每个对象中可能有许多其他属性需要我保留(希望没有明确的枚举)。
我尝试过直接使用 .partitiontable.partitions[].end = .size + .start,但这些“end”属性最终为空,我推测是因为没有“上下文”。我还尝试过使用“..”运算符进行递归,但我只得到局部范围对象作为输出。(jq '.. |objects | select(.start) |.end = .start +.size' 产生数组对象但丢失了外部文档。)
更新操作
|=
是将 LHS 的上下文提升到 RHS 的分配。这样,.start
、.size
和.end
就可以正确解析了。演示