You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

命令解析

  1. 子节点排序:(.Australia.zoo.animals) |= sort_by(.animal)
    定位到Australia.zoo.animals数组,按animal字段的字典序排序数组元素。
  2. 顶层节点处理:. = ({Australia: .Australia} + (del(.Australia) | to_entries | sort_by(.key) | from_entries))
    • 先提取Australia节点单独保存
    • 删除原对象中的Australia节点
    • 将剩余节点转换为键值对数组,按键名排序后转回对象
    • 合并Australia节点与排序后的剩余对象,确保Australia始终在文档顶部

内容的提问来源于stack exchange,提问作者thleo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:05:05