如何对YAML文件顶层节点排序并排除指定行?
YAML文件节点排序实现方案
需求说明
需实现两个目标:
- 指定顶层节点(如示例中的
Australia)固定在文档顶部,其余顶层节点按键名排序 - 对指定顶层节点的子节点(如
Australia.zoo.animals)按子键(animal字段)排序
示例文件与期望效果
原始文件(data1.yaml)
--- Australia: zoo: animals: - animal: kangaroos population: 3 - animal: bears population: 5 - animal: aardvark population: 3 awsFunctionminimor: - name: minimor awsFunctionfabulous: - name: fabulous awsFunctiondancingpear: - name: dancingp
期望输出
--- Australia: zoo: animals: - animal: aardvark population: 3 - animal: bears population: 5 - animal: kangaroos population: 3 awsFunctiondancingpear: - name: dancingp awsFunctionfabulous: - name: fabulous awsFunctionminimor: - name: minimor
已尝试方案问题
执行命令 yq '. |= sort_by(.)' data1.yml 失败,原因是YAML顶层是对象而非数组,sort_by() 仅适用于数组类型,无法直接对对象的键进行排序。
正确解决方案(基于mikefarah/yq v4+)
使用以下命令可同时实现子节点排序与顶层节点固定+排序:
yq '(.Australia.zoo.animals) |= sort_by(.animal) | . = ({Australia: .Australia} + (del(.Australia) | to_entries | sort_by(.key) | from_entries))' data1.yaml
命令解析
- 子节点排序:
(.Australia.zoo.animals) |= sort_by(.animal)
定位到Australia.zoo.animals数组,按animal字段的字典序排序数组元素。 - 顶层节点处理:
. = ({Australia: .Australia} + (del(.Australia) | to_entries | sort_by(.key) | from_entries))- 先提取
Australia节点单独保存 - 删除原对象中的
Australia节点 - 将剩余节点转换为键值对数组,按键名排序后转回对象
- 合并
Australia节点与排序后的剩余对象,确保Australia始终在文档顶部
- 先提取
内容的提问来源于stack exchange,提问作者thleo
相关产品推荐
相关产品推荐

