第 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 或其他解决方案感到满意,但如果可能的话,单行代码(而不是带有嵌套循环的完整多行代码块)将是首选。 我想看看实现这一目标的最优雅/最有效的方法是什么。请:-)
我允许自己把评论变成钥匙。那就是:
- 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
可以在这里找到。