使用 yq4 将一个键下的所有内容移动到 yaml 中的另一个路径
Use yq4 to move everything under one key to another path in the yaml
我有以下格式的 yaml:
car_facts:
colour: 'red'
spec:
tyres: 4
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
我正在寻找可以移动所有内容的 yq4 命令
在 car_facts
下放置到 yaml (car
) 中的新字段。理想情况下,它也会删除现有字段(尽管这可以在后续命令中使用 delete 运算符来完成)。所以目标状态将是:
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
colour: 'red'
spec:
tyres: 4
与此示例一样,原始键下的字段可能是嵌套的。就我而言,目标下不可能存在原始密钥的路径。
我查看了 docs 但没有看到针对此特定案例的示例。
我试过 yq4 -- eval --inplace '.car_facts.[] +=.vehicles.car'
但是 returns Error: Maps not yet supported for addition
.
这在 mikefarah/yq 实现中尚不支持,因为对 map
类型的添加或合并操作不可用。
但是Python yq开箱即用地支持它,因为底层jq
支持对JSON类型的操作。由于此 yq
只是 jq
的包装器,所有操作都在 JSON 上使用 jq 执行并转换回 YAML。所以像下面这样的东西应该可以工作
yq -Y --in-place '.vehicles.car += .car_facts | del(.car_facts)' yaml
现在可以使用在版本 4.13.0 中添加的新 with
运算符来做到这一点。
https://mikefarah.gitbook.io/yq/operators/with
sample.yml
car_facts:
colour: 'red'
spec:
tyres: 4
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
命令
yq4 '{"vehicles":.vehicles} as $root |
{"car":.car_facts} as $car |
with($root.vehicles; . |= . *+ $car) |
$root' sample.yml
- 首先,创建一个新的
$root
变量,包含原始 vehicles
地图。
- 然后,创建一个新的
$car
变量,包含原始 car_facts
地图。
- 然后,将
$car
变量合并到 $root.vehicles
映射中。
- 最后,输出合并后的
$root
变量。
输出
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
colour: 'red'
spec:
tyres: 4
我有以下格式的 yaml:
car_facts:
colour: 'red'
spec:
tyres: 4
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
我正在寻找可以移动所有内容的 yq4 命令
在 car_facts
下放置到 yaml (car
) 中的新字段。理想情况下,它也会删除现有字段(尽管这可以在后续命令中使用 delete 运算符来完成)。所以目标状态将是:
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
colour: 'red'
spec:
tyres: 4
与此示例一样,原始键下的字段可能是嵌套的。就我而言,目标下不可能存在原始密钥的路径。
我查看了 docs 但没有看到针对此特定案例的示例。
我试过 yq4 -- eval --inplace '.car_facts.[] +=.vehicles.car'
但是 returns Error: Maps not yet supported for addition
.
这在 mikefarah/yq 实现中尚不支持,因为对 map
类型的添加或合并操作不可用。
但是Python yq开箱即用地支持它,因为底层jq
支持对JSON类型的操作。由于此 yq
只是 jq
的包装器,所有操作都在 JSON 上使用 jq 执行并转换回 YAML。所以像下面这样的东西应该可以工作
yq -Y --in-place '.vehicles.car += .car_facts | del(.car_facts)' yaml
现在可以使用在版本 4.13.0 中添加的新 with
运算符来做到这一点。
https://mikefarah.gitbook.io/yq/operators/with
sample.yml
car_facts:
colour: 'red'
spec:
tyres: 4
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
命令
yq4 '{"vehicles":.vehicles} as $root |
{"car":.car_facts} as $car |
with($root.vehicles; . |= . *+ $car) |
$root' sample.yml
- 首先,创建一个新的
$root
变量,包含原始vehicles
地图。 - 然后,创建一个新的
$car
变量,包含原始car_facts
地图。 - 然后,将
$car
变量合并到$root.vehicles
映射中。 - 最后,输出合并后的
$root
变量。
输出
vehicles:
tractor:
speed: 'slow'
car:
speed: 'fast'
colour: 'red'
spec:
tyres: 4