如何用 yq 的 pick 按指定顺序保留映射键并用 omit 剔除键
【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq
处理 YAML 文件时经常遇到这样的需求:一个映射里键很多,但只想要其中几个,并且希望输出的键顺序由自己指定;或者相反,想按"黑名单"把不要的键剔除掉。yq 提供了两个配套的操作符完成这件事:pick按指定键列表保留键,并且返回的键顺序与 pick 列表中的顺序一致;omit则按指定键列表剔除键。两者都是 yq 表达式的一部分,yq 采用类 jq 语法,对 YAML、JSON 等格式通用。
本文给出这两个操作符在映射键上的完整用法:命令、输入文件、对应的文档示例输出,以及如何用-i把结果写回文件。
准备条件
- 已安装 yq 二进制。yq 用 Go 编写,提供无依赖的单文件二进制,可通过直接下载二进制、
brew install yq或snap install yq等方式安装,参见 README.md 的 Install 章节。 - 一个待处理的 YAML 文件。本文沿用 yq 文档中 pick.md 使用的样例文件
sample.yml:
myMap: cat: meow dog: bark thing: hamster hamster: squeaksample.yml为占位文件名,实际使用时替换成你自己的 YAML 文件路径即可。
用 pick 按指定顺序保留映射键
对目标映射使用相对赋值形式|=,把映射替换为pick(...)的结果。语法要点(|=是 assign 操作符 的相对形式,以 LHS 节点本身作为上下文对 RHS 求值):
yq '.myMap |= pick(["hamster", "cat", "goat"])' sample.yml规则(来自 pick.md):
- 返回的键顺序与 pick 列表中的顺序一致:这里先列出
hamster、再cat,所以hamster排在前面; - 列表中不存在于映射的键(如
goat)会被跳过,不会报错。
按文档示例,上面的命令输出为:
myMap: hamster: squeak cat: meow可选分支:指定键置顶,同时保留其余全部键
如果不想丢键,只想让某几个键排到前面,可以把"指定键 + 现有全部键"拼成列表后去重,再交给pick。文档给出的写法是:
yq '.myMap |= pick( (["thing"] + keys) | unique)' sample.yml其中keys操作符返回当前映射的全部键(见 keys.md),unique去掉拼接后产生的重复项并保持原数组顺序(见 unique.md)。文档示例输出:
myMap: thing: hamster cat: meow dog: bark hamster: squeak用 omit 按黑名单剔除键
omit与pick互补:你列出不想要的键,其余键保留。语法与pick相同,只需替换操作符名(见 omit.md):
yq '.myMap |= omit(["hamster", "cat", "goat"])' sample.yml规则同样是"不存在的键被跳过"(goat不在映射中,不影响执行)。按文档示例,输出为:
myMap: dog: bark thing: hamster注意区别:omit保留的是原文件中未被剔除的键,它们的相对顺序维持原文件的键顺序(dog在thing前),而pick的输出顺序由你传入的列表决定。选择哪个操作符取决于你的需求是白名单(保留指定键、自己定序)还是黑名单(剔除指定键、其余不动)。
把结果写回文件
上面的命令只把结果打印到标准输出,不修改原文件。README 的 Quick Usage Guide 给出原地更新方式,加-i标志:
yq -i '.myMap |= pick(["hamster", "cat", "goat"])' sample.yml执行后sample.yml的内容被更新为 pick 的结果。该操作会直接改写文件,没有备份机制,执行前请确认文件可被覆盖(或自行先做备份)。
验证方式与边界
验证方法直接看命令输出(或-i后查看文件内容),对照文档示例判断:
pick:输出的键集合应等于"pick 列表 ∩ 原映射键集合",且键顺序与 pick 列表一致;omit:输出应为原映射去掉黑名单键,剩余键维持原顺序。
两个操作符都接受不存在的键而不报错,所以输出与预期不符时,应优先检查键名拼写是否与映射中的键一致,而不是担心"缺少键"导致失败。
pick/omit同样适用于数组,此时列表传的是下标而非键名,且同样跳过不存在的下标。例如对文件:
- cat - leopard - lion文档示例命令:
yq 'pick([2, 0, 734, -5])' sample.yml输出:
- lion - cat对应的数组 omit 示例(yq 'omit([2, 0, 734, -5])' sample.yml,输出- leopard)见 omit.md。本文主路径是映射键,数组用法仅作了解。
更多表达式用法可参考仓库中pkg/yqlib/doc/operators/下的操作符文档目录。
【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考