yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。
读取
1 | yq r <yaml_file|json_file> <path> |
此命令也可以将json文件作为输入,并将输出yaml,除非指定导出为json(-j)
基本操作
给出sample.yaml文件:
1 | b: |
然后
1 | yq r sample.yaml b.c |
将输出值’2’。
从标准输入读取
给出sample.yaml文件:
1 | cat sample.yaml | yq r - b.c |
将输出值’2’。
通配符
给出sample.yaml文件:
1 | ---- |
然后
1 | yq r sample.yaml bob.*.cats |
输出
1 | - bananas |
前缀匹配
给出sample.yaml文件:
1 | ---- |
然后
1 | yq r sample.yaml bob.item*.cats |
输出
1 | - bananas |
多文档 - 指定单个文档
给出sample.yaml文件:
1 | something: else |
然后
1 | yq r -d1 sample.yaml b.c |
将输出值’2’。
多文档 - 指定所有文档
读取所有文档将以数组形式返回结果。如果需要,可以使用’-j’标志将其转换为json。
给出sample.yaml文件:
1 | name: Fred |
然后
1 | yq r -d'*' sample.yaml name |
输出
1 | - Fred |
数组
您可以提供一个索引来访问特定元素:例如:给定一个示例文件
1 | b: |
然后
1 | yq r sample.yaml 'b.e[1].name' |
将输出’sam’。
请注意,路径是引号,以避免shell解释方括号。
数组匹配
给出sample.yaml文件:
1 | b: |
然后
1 | yq r sample.yaml 'b.e[*].name' |
输出
1 | - fred |
请注意,路径是引号,以避免shell解释方括号。
带点号的Key
指定具有点号使用键查找指示符的键时。
1 | b: |
1 | yaml r sample.yaml 'b[foo.bar]' |
1 | yaml w sample.yaml 'b[foo.bar]' 9 |
可以将任何有效的yaml key指定为key查找的一部分。
请注意,路径是引号,以避免shell解释方括号。
带有破折号的键(和值)
如果键或值具有前导破折号,则yq将不知道您传递的是值而不是标志(并且您将收到“错误标志语法”错误)。
要解决这个问题,你需要告诉它通过在最后一个标志之后添加’ - ‘来停止处理标志,如下所示:
1 | yq n -t -- --key --value |
返回
1 | ` --key: --value |
写/更新
1 | yq w <yaml_file> <path> <new value> |
写到标准输出
给出sample.yaml文件:
1 | b: |
然后
1 | yq w sample.yaml b.c cat |
输出
1 | b: |
从标准输入读取
1 | cat sample.yaml | yq w - b.c blah |
添加新字段
路径中的任何缺少的字段都将动态创建。
给出sample.yaml文件:
1 | b: |
然后
1 | yq w sample.yaml b.d[+] "new thing" |
输出
1 | b: |
通配符
给出sample.yaml文件:
1 |
|
然后
1 | yq w sample.yaml bob.*.cats meow |
输出
1 | --- |
前缀匹配
给出sample.yaml文件:
1 |
|
然后
1 | yq w sample.yaml bob.item*.cats meow |
输出
1 |
|
数组匹配
给出sample.yaml文件:
1 |
|
然后
1 | yq w sample.yaml bob[*].cats meow |
输出
1 |
|
数组字段添加值
给出sample.yaml文件:
1 | b: |
然后
1 | yq w sample.yaml "b.d[+]" "bar thing" |
输出
1 | b: |
请注意,路径是引号,以避免shell解释方括号。
多文档 - 更新单个文档
给出sample.yaml文件:
1 | something: else |
然后
1 | yq w -d1 sample.yaml b.c 5 |
输出
1 | something: else |
多文档 - 更新所有文档
读取所有文档将以数组形式返回结果。如果需要,可以使用’-j’标志将其转换为json。
给出sample.yaml文件:
1 | something: else |
然后
1 | yq w -d'*' sample.yaml b.c 5 |
输出
1 | something: else |
请注意,’*’在引号中以避免被shell解释。
更新文件
给出sample.yaml文件:
1 | b: |
然后
1 | yq w -i sample.yaml b.c cat |
将更新sample.yaml文件,将’c’的值改为cat。
使用脚本更新多个值
给出sample.yaml文件:
1 | b: |
和脚本update_instructions.yaml文件:
1 | b.c: 3 |
然后
1 | yq w -s update_instructions.yaml sample.yaml |
输出
1 | b: |
当然,也可以使用管道命令:
1 | cat update_instructions.yaml | yq w -s - sample.yaml |
以连字符(或短划线)开头的值
需要使用标志终止符来阻止应用程序尝试将后续参数解析为标志:
1 | yq w -- my.path -3 |
输出
1 | my: |
带点号的Key
指定具有点号使用键查找指示符的键时。
1 | b: |
1 | yaml r sample.yaml 'b[foo.bar]' |
1 | yaml w sample.yaml 'b[foo.bar]' 9 |
可以将任何有效的yaml key指定为key查找的一部分。
请注意,路径是引号,以避免shell解释方括号。
带有破折号的键(和值)
如果键或值具有前导破折号,则yq将不知道您传递的是值而不是标志(并且您将收到“错误标志语法”错误)。
要解决这个问题,你需要告诉它通过在最后一个标志之后添加’ - ‘来停止处理标志,如下所示:
1 | yq n -t -- --key --value |
返回
1 | ` --key: --value |