如何使用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
相关产品推荐
相关产品推荐

