如何用 yq 的 pick 按指定顺序保留映射键并用 omit 剔除键
2026/9/15 19:18:24 网站建设 项目流程

如何用 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 yqsnap install yq等方式安装,参见 README.md 的 Install 章节。
  • 一个待处理的 YAML 文件。本文沿用 yq 文档中 pick.md 使用的样例文件sample.yml
myMap: cat: meow dog: bark thing: hamster hamster: squeak

sample.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 按黑名单剔除键

omitpick互补:你列出不想要的键,其余键保留。语法与pick相同,只需替换操作符名(见 omit.md):

yq '.myMap |= omit(["hamster", "cat", "goat"])' sample.yml

规则同样是"不存在的键被跳过"(goat不在映射中,不影响执行)。按文档示例,输出为:

myMap: dog: bark thing: hamster

注意区别:omit保留的是原文件中未被剔除的键,它们的相对顺序维持原文件的键顺序(dogthing前),而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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询