yq:对 YAML 文件中的数组切片进行排序

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

样品

file.yml
:

---
- foo: bar
  bing:
    - bong
    - bang
  people:
    - { name: pin, nicknames: ['pin', 'first'] }
    - { name: deb, nicknames: ['deb'] }
    - { name: roger, nicknames: ['roger'] }
    - { name: kenny, nicknames: ['kenny'] }
    - { name: annie, nicknames: ['annie'] }

我正在尝试使用 yq 按

people
name
对象进行排序,但
pin
应该保留在第一位。

所需输出:

---
- foo: bar
  bing:
    - bong
    - bang
  people:
    - { name: pin, nicknames: ['pin', 'first'] }
    - { name: annie, nicknames: ['annie'] }
    - { name: deb, nicknames: ['deb'] }
    - { name: kenny, nicknames: ['kenny'] }
    - { name: roger, nicknames: ['roger'] }
❯ yq -V
yq (https://github.com/mikefarah/yq/) version v4.31.2

我已经进行了切片和排序,但只打印排序后的切片:

❯ yq '.[].people.[1:] | sort_by(.name)' file.yml
- {name: annie, nicknames: ['annie']}
- {name: deb, nicknames: ['deb']}
- {name: kenny, nicknames: ['kenny']}
- {name: roger, nicknames: ['roger']}

不知道如何让其余的恢复正常,或者我是否走在正确的轨道上。

shell command-line yaml slice yq
1个回答
0
投票

你的方向非常正确。

❯ yq '.[].people.[1:] | sort_by(.name)' file.yml

使用

|
可以向下遍历数组(切片)。相反,请使用
|=
来更新它,同时保留原始上下文。

yq '.[].people.[1:] |= sort_by(.name)' file.yml
---
- foo: bar
  bing:
    - bong
    - bang
  people:
    - {name: pin, nicknames: ['pin', 'first']}
    - {name: deb, nicknames: ['deb']}
    - {name: roger, nicknames: ['roger']}
    - {name: kenny, nicknames: ['kenny']}
    - {name: annie, nicknames: ['annie']}
© www.soinside.com 2019 - 2024. All rights reserved.