yaml - 使用 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
解决方案
使用yq可以轻松解决您的任务。
bash 脚本显示了两个略有不同的版本:
- 在版本 1 中,三个参数
imageNo
name
和value
被传递给yq
. - 在版本 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
推荐阅读
- javascript - 角度自定义输入掩码
- html - 溢出文本块直接跳转到 Angular 中的交互元素
- css - 如何在不使用媒体查询的情况下根据屏幕大小使 CSS Grid 填充所有可用空间
- python - Python如何搜索关键字列表并输出匹配的列数
- python - 管理来自同一 API 的多个请求的最佳方式是什么?
- r - 警告:$: $ 运算符中的错误对于 Shiny Web 应用程序中的原子向量无效
- javascript - 用户注册完成后如何关闭窗口
- r - R:为多个列的名称添加后缀
- c++ - 为什么 c++ 中这种奇怪的函数语法有效?
- python-3.x - 如何使用 python 将 INT 类型的值添加到列表中?