简介

类似于常用的命令行下处理json的工具jq,处理yaml可以使用yq

在使用yq之前,我曾经使用sed将yaml作为普通的纯文本文件进行编辑,虽然也可以实现目的,但是一旦需求复杂以后,实现起来会比较困难,yq/jq这种可以对yaml或json的数据逻辑提供支持的工具可以更高效地实现复杂的操作。

版本

注意:yq的最新大版本是v4,其命令行和语法和以前的版本变化较大,网上目前文档大多是以前v3或更老版本的,请注意区分。

本文的整理基于v4版本。

  • 合并多个yml文件的值:yq ea '.global as $item ireduce ({}; . * $item )' 1.yml 2.yml,其中.global是待合并的yaml层级表示,示例表示把1.yml和2.yml里的.global下的所有yml值做合并,生成一段新的yml
  • 从字面值创建yml:yq -n '.b.c = "cat"'

  • 原地删除yml文件的指定字段:yq -i 'del(.global)' 1.yml

  • 原地修改指定字段:yq -i '.version = "abcde"' 1.yml
  • 原地修改list中的每个子元素:yq -i '.webhooks[].clientConfig.caBundle = 1234 ' config/webhook/manifests.yaml
  • 从环境变量中读取目标值:c=$(cat tls.crt|base64 -w 0) yq -i '.webhooks[].clientConfig.caBundle = env(c) ' config/webhook/manifests.yaml。注意:如果写在Makefile里,需要根据Make的特性稍作修改。
  • 将已有的yaml放进指定的前缀里:
    • 从标准输入读入:yq ea '.global as $item ireduce ({}; . * $item )' 1.yml 2.yml | yq '{"global": .}',将1.yml和2.yml的global字段合并,然后放到global字段里
    • 从文件读入:yq '{"c": {"d": . }}' data1.yml

  • 查询指定字段的值:yq '.a.b.c' 1.yml

参考

yq - yq (gitbook.io)

文章目录