如何根据特定键的值对 yaml 文件进行排序

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

第 1 部分:我有一个 yaml 文件,其中包含许多定义输入文本及其替换文本的块。 每个块都有一个触发器键和该触发器的值、一个替换键和触发器所替换的值以及注释行:例如

# ::;waf::web application firewall
  - trigger: ";waf"
    replace: "web application firewall"

# ::;m$::Microsoft
  - trigger: ";m$"
    replace: "Microsoft"

# ::;sf::Salesforce
  - trigger: ";sf"
    replace: "Salesforce"

我想根据触发键的值对块进行排序

# ::;m$::Microsoft
  - trigger: ";m$"
    replace: "Microsoft"

# ::;sf::Salesforce
  - trigger: ";sf"
    replace: "Salesforce"

# ::;waf::web application firewall
  - trigger: ";waf"
    replace: "web application firewall"

如果注释搞砸了,那么我可以使用 reg exp 将注释从前一行移动到触发行末尾的内联注释。 我试图避免的是使用正则表达式将三行变成一行,然后排序,然后再次分成三行,因为......

...第 2 部分: 我有一个类似的文件,同样有很多块。 每个块至少有一个触发键、一个替换键和一个注释行,但也可能有其他键值对。 每个块总是以一个触发器开始。 我想根据触发键的值对块进行排序,但保留块。 使用正则表达式来连接未知且数量可变的键值对让我很头疼。

我选择的编辑器是 VScodium,我尝试了 YAML 排序扩展,但它按键名称排序,而不是键值,或者至少按照我的配置方式排序。 我对 bash、sed、awk 或其他解决方案感到满意,但如果可能的话,单行代码(而不是带有嵌套循环的完整多行代码块)将是首选。 我想看看实现这一目标的最优雅/最有效的方法是什么。请:-)

bash shell sorting yaml espanso
1个回答
0
投票

我允许自己把评论变成钥匙。那就是:

- trigger: ";waf"
  replace: "web application firewall"
  comment: ::;waf::web application firewall

- trigger: ";m$"
  replace: "Microsoft"
  comment: ::;m$::Microsoft

- trigger: ";sf"
  replace: "Salesforce"
  comment: ::;sf::Salesforce

如果这对你有用,那么使用:

cat foo.yml | yq '.|=sort_by(.trigger)'

你会得到你想要的:

- trigger: ";m$"
  replace: "Microsoft"
  comment: ::;m$::Microsoft
- trigger: ";sf"
  replace: "Salesforce"
  comment: ::;sf::Salesforce
- trigger: ";waf"
  replace: "web application firewall"
  comment: ::;waf::web application firewall

如果您想知道,

yq
可以在这里找到。

© www.soinside.com 2019 - 2024. All rights reserved.