如何按顶级节点对 yaml 文件进行排序,同时从排序中排除某些行?

问题描述 投票:0回答:1

我正在努力做什么

我有一个文件,其中有一个顶级父级,我想将其保留在文档的顶部,然后我还有许多其他父级,我想根据子键进行排序。我希望能够仅对那些后续父节点进行排序,并将特定父节点保留在它存在的文件中的任何位置。

我希望能够做什么

如果我们有 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

我们运行一个命令:

yq '. |= sort_by(.) && ignorelines=[(1,16)]' data1.yaml

可以输出

---
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
,但它不起作用,因为节点不是数组。

sorting yaml yq
1个回答
0
投票

更新上下文节点,如

. |= …
所示,是多余的;作为更新运算符的 RHS 提供的函数始终应用于当前上下文。此外,使用
sort_by(.)
并以上下文作为条件与仅使用
sort
相同。

您想要遍历要排序的数组(此处为

.Australia.zoo.animals
),然后使用
|=
并提供排序标准作为参数来更新
sort_by
。在这里,您似乎只想按
.animal
的本地值进行排序。要引入辅助标准(例如
.population
length
等),只需将这些值作为流附加到标准参数(例如
sort_by(.animal, .population)
)即可。

这适用于 yq 的两种实现(使用 mikefarah/yq 版本 v4.34.1 和 kislyuk/yq 版本 2.12.0 进行测试),请指定您要针对哪一个。

.Australia.zoo.animals |= sort_by(.animal)
---
Australia:
  zoo:
    animals:
      - animal: aardvark
        population: 3
      - animal: bears
        population: 5
      - animal: kangaroos
        population: 3
awsFunctionminimor:
  - name: minimor
awsFunctionfabulous:
  - name: fabulous
awsFunctiondancingpear:
  - name: dancingp
© www.soinside.com 2019 - 2024. All rights reserved.