使用 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
  1. 首先,创建一个新的 $root 变量,包含原始 vehicles 地图。
  2. 然后,创建一个新的 $car 变量,包含原始 car_facts 地图。
  3. 然后,将 $car 变量合并到 $root.vehicles 映射中。
  4. 最后,输出合并后的$root变量。
输出
vehicles:
  tractor:
    speed: 'slow'
  car:
    speed: 'fast'
    colour: 'red'
    spec:
      tyres: 4