首页 > 解决方案 > 使用 yq 将对象添加到现有字段

问题描述

我有以下 yaml 文件:

some:
  fields: ...
# ...

images:
  image_1:
    name: "some-name"
    value: 1111
# ...

some:
  other-fields: ...

我想使用相同的模板添加生成的对象image_1

image_<no>:
  name: "<name>"
  value: <value>

我发现了如何使用构建对象,yq但是,我在将其添加到现有字段 ( images) 时遇到问题,在最后一个元素下。我用来构建对象的简化脚本。

yq eval '{"image_no": {"name": "my_name", value: 1111}' myfile.yml

标签: yamlyq

解决方案


使用yq可以轻松解决您的任务。

bash 脚本显示了两个略有不同的版本:

  1. 在版本 1 中,三个参数imageNo namevalue被传递给yq.
  2. 在版本 2 中,该参数imageNo是在脚本中根据当前图像数量计算得出的。
#!/bin/bash

FILE='
some:
  fields: "value"

images:
  image_1:
    name: "some-name"
    value: 1111
  image_2:
    name: "some-name-2"
    value: 1112
  image_3:
    name: "some-name-3"
    value: 1113

some:
  other-fields: "other-value"
'

echo adding new image to yaml - version 1
yq -y --argjson imageNo 4 --arg name "my_name" --argjson value 1114 '
  .images += { 
               "image_\($imageNo)":
               { 
                 name: $name,
                 value: $value
               }
             }' <<< "$FILE"

echo adding new image to yaml - version 2
yq -y --arg name "my_name" --argjson value 1114 '
  (.images | keys | length + 1) as $imageNo
  | .images += { 
                 "image_\($imageNo)":
                   { 
                     name: $name,
                     value: $value
                   }
               }' <<< "$FILE"

output版本 1 和版本 2

some:
  other-fields: other-value
images:
  image_1:
    name: some-name
    value: 1111
  image_2:
    name: some-name-2
    value: 1112
  image_3:
    name: some-name-3
    value: 1113
  image_4:
    name: my_name
    value: 1114

推荐阅读