如何用yq向YAML的foo列表按字母序添加值并保留原结构?
问题:向YAML列表按字母顺序插入新值并保留完整结构
现有foo.yaml文件内容如下:
foo: - a - c bar: - foo: bar foo2: bar2
需要向foo列表中按字母顺序添加新值b,但尝试的几种方法都存在问题:
- 使用
+=添加值,但不会自动排序:
$ yq '.foo += "b"' foo.yaml foo: - a - c - b bar: - foo: bar foo2: bar2
- 使用
+结合sort()只能得到排序后的列表,丢失原文件的其他结构:
$ yq '.foo + "b" | sort()' foo.yaml - a - b - c
- 存入bash变量后再赋值,会将列表转为多行文本格式:
$ variable=$(yq '.foo + "b" | sort()' foo.yaml) $ yq ".foo = \"$variable\"" foo.yaml foo: |- - a - b - c bar: - foo: bar foo2: bar2
有没有更简便的方法,能向foo列表按字母顺序插入新值,同时保留YAML文件的其余结构?
解决方案
直接通过yq一次性完成合并、排序和赋值操作,即可保留完整的YAML结构:
yq '.foo = (.foo + ["b"] | sort())' foo.yaml
执行后输出结果:
foo: - a - b - c bar: - foo: bar foo2: bar2
关键说明:
(.foo + ["b"]):将原foo列表与包含b的新列表合并,得到临时列表[a, c, b]| sort():对合并后的临时列表按字母顺序排序.foo = ...:将排序后的结果重新赋值给foo字段,同时保留文件中其他字段的结构
内容的提问来源于stack exchange,提问作者cookandy
相关产品推荐
相关产品推荐

