使用 yq (macOS) 清理 YAML 前端内容

Sanitize YAML front matter content with yq (macOS)

我有大约 30,000 个 .md 文件,其中包括前言。 他们都有不同的密钥集。为了按字母顺序对它们进行排序,我成功地使用了 brew yq 和 find。

find ./ -type f -name "*.md" -exec yq -i -f process 'sort_keys(.)' "{}" \;

现在我需要清理具有以下三种形式之一的标签

---
author: Karen the Trollmaster
tags: [legal, business, security]
tags: legal, business, security
tags: legal,business/entrepreneurship security
---

我需要按字母顺序对它们进行排序,并将它们从字符串转换为适当的数组

tags: [business/entrepreneurship, legal, security]

我试过了

yq '.tags | sub("," , " ") | split(" ")' something.md

yq '.tags | sub("," , " ") | map(split(" "))' something.md

但我得到的只是一个空数组,或者一条错误提示不能用 !!null

替代

所需的输出将是一个没有“”的数组。=16=]

tags: [business/entrepreneurship, legal, security, watermelons]

修改front-matter内容时需要传入--front-matter=process并传入修改标签所需的表达式

对于情况 1) pre-formatted 只需要排序的数组表示法,使用 yq as

yq e -f process '.tags |= sort' yaml

对于情况 2) , 上需要的拆分,请按以下方式进行。 flow 样式将数组内容放在 [..]

yq e -f process '.tags |= (split(", ") | sort | . style="flow") ' yaml

对于情况 3),不清楚输入是否有效,因为强制分隔符 , 不作为输入的一部分出现。视情况使用案例 2 的解决方案。

注意:如果您使用的是 yq 4.18.1 或更高版本,the eval flag e is no longer needed 因为它已成为默认操作。