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

如何使用yq(GO/Mike Farah)递归排序所有嵌套数组?

如何用yq(Mike Farah版)递归排序所有嵌套数组?

Mike Farah开发的yq支持数组排序,但不知道怎么应用到深层嵌套的数组上。

输入YAML

classes:
  driver:
    fields:
      - height
      - weight
      - age
  vehicle:
    fields:
      - model
      - manufacturer
      - color
      - year

期望输出

classes:
  driver:
    fields:
      - age
      - height
      - weight
  vehicle:
    fields:
      - color
      - manufacturer
      - model
      - year

我尝试全局排序:

cat to_sort.yaml | yq 'sort'

报错:

Error: node at path [] is not an array (it's a !!map)

也试过指定路径排序,但参数不对:

cat to_sort.yaml | yq 'sort(classes.driver.fields)'

报错:

Error: 1:6: invalid input text "classes.driver.f..."

见过一些yq示例需要先做选择操作,但不知道怎么在这个场景用,求解决方法。


解决方法

要递归处理所有嵌套数组,需要用..递归遍历所有节点,筛选出数组类型,然后对每个数组执行排序操作:

yq '(.. | select(tag == "!!seq")) |= sort' to_sort.yaml

命令解释:

  • ..:递归遍历YAML结构中的所有节点
  • select(tag == "!!seq"):筛选出所有数组(YAML中数组的标签是!!seq)
  • |= sort:对筛选出的每个数组执行排序操作,并将结果写回原位置

如果只想针对特定路径下的数组(比如所有fields数组),可以更精准地指定路径:

yq '.classes[].fields |= sort' to_sort.yaml

这个命令的作用:

  • .classes[]:遍历classes下的所有子节点(driver、vehicle)
  • .fields |= sort:对每个子节点下的fields数组进行排序并写回

这样就能得到你想要的排序后的YAML结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:50:23