yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。
读取
1
| yq r <yaml_file|json_file> <path>
|
此命令也可以将json文件作为输入,并将输出yaml,除非指定导出为json(-j)
基本操作
给出sample.yaml文件:
然后
将输出值’2’。
从标准输入读取
给出sample.yaml文件:
1
| cat sample.yaml | yq r - b.c
|
将输出值’2’。
通配符
给出sample.yaml文件:
1 2 3 4 5 6 7 8
| ---- bob: item1: cats: bananas item2: cats: apples thing: cats: oranges
|
然后
1
| yq r sample.yaml bob.*.cats
|
输出
1 2 3
| - bananas - apples - oranges
|
前缀匹配
给出sample.yaml文件:
1 2 3 4 5 6 7 8
| ---- bob: item1: cats: bananas item2: cats: apples thing: cats: oranges
|
然后
1
| yq r sample.yaml bob.item*.cats
|
输出
多文档 - 指定单个文档
给出sample.yaml文件:
1 2 3 4
| something: else --- b: c: 2
|
然后
1
| yq r -d1 sample.yaml b.c
|
将输出值’2’。
多文档 - 指定所有文档
读取所有文档将以数组形式返回结果。如果需要,可以使用’-j’标志将其转换为json。
给出sample.yaml文件:
1 2 3 4 5 6 7 8
| name: Fred age: 22 --- name: Stella age: 23 --- name: Android age: 232
|
然后
1
| yq r -d'*' sample.yaml name
|
输出
1 2 3
| - Fred - Stella - Android
|
数组
您可以提供一个索引来访问特定元素:例如:给定一个示例文件
1 2 3 4 5 6
| b: e: - name: fred value: 3 - name: sam value: 4
|
然后
1
| yq r sample.yaml 'b.e[1].name'
|
将输出’sam’。
请注意,路径是引号,以避免shell解释方括号。
数组匹配
给出sample.yaml文件:
1 2 3 4 5 6
| b: e: - name: fred value: 3 - name: sam value: 4
|
然后
1
| yq r sample.yaml 'b.e[*].name'
|
输出
请注意,路径是引号,以避免shell解释方括号。
带点号的Key
指定具有点号使用键查找指示符的键时。
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
| yq w <yaml_file> <path> <new value>
|
写到标准输出
给出sample.yaml文件:
然后
1
| yq w sample.yaml b.c cat
|
输出
从标准输入读取
1
| cat sample.yaml | yq w - b.c blah
|
添加新字段
路径中的任何缺少的字段都将动态创建。
给出sample.yaml文件:
然后
1
| yq w sample.yaml b.d[+] "new thing"
|
输出
1 2 3 4
| b: c: cat d: - new thing
|
通配符
给出sample.yaml文件:
1 2 3 4 5 6 7 8
| --- bob: item1: cats: bananas item2: cats: apples thing: cats: oranges
|
然后
1
| yq w sample.yaml bob.*.cats meow
|
输出
1 2 3 4 5 6 7 8
| --- bob: item1: cats: meow item2: cats: meow thing: cats: meow
|
前缀匹配
给出sample.yaml文件:
1 2 3 4 5 6 7 8
| --- bob: item1: cats: bananas item2: cats: apples thing: cats: oranges
|
然后
1
| yq w sample.yaml bob.item*.cats meow
|
输出
1 2 3 4 5 6 7 8
| --- bob: item1: cats: meow item2: cats: meow thing: cats: oranges
|
数组匹配
给出sample.yaml文件:
1 2 3 4 5
| --- bob: - cats: bananas - cats: apples - cats: oranges
|
然后
1
| yq w sample.yaml bob[*].cats meow
|
输出
1 2 3 4 5
| --- bob: - cats: meow - cats: meow - cats: meow
|
数组字段添加值
给出sample.yaml文件:
1 2 3 4 5
| b: c: 2 d: - new thing - foo thing
|
然后
1
| yq w sample.yaml "b.d[+]" "bar thing"
|
输出
1 2 3 4 5 6
| b: c: 2 d: - new thing - foo thing - bar thing
|
请注意,路径是引号,以避免shell解释方括号。
多文档 - 更新单个文档
给出sample.yaml文件:
1 2 3 4
| something: else --- b: c: 2
|
然后
1
| yq w -d1 sample.yaml b.c 5
|
输出
1 2 3 4
| something: else --- b: c: 5
|
多文档 - 更新所有文档
读取所有文档将以数组形式返回结果。如果需要,可以使用’-j’标志将其转换为json。
给出sample.yaml文件:
1 2 3 4
| something: else --- b: c: 2
|
然后
1
| yq w -d'*' sample.yaml b.c 5
|
输出
1 2 3 4 5 6
| something: else b: c: 5 --- b: c: 5
|
请注意,’*’在引号中以避免被shell解释。
更新文件
给出sample.yaml文件:
然后
1
| yq w -i sample.yaml b.c cat
|
将更新sample.yaml文件,将’c’的值改为cat。
使用脚本更新多个值
给出sample.yaml文件:
1 2 3 4
| b: c: 2 e: - name: Billy Bob
|
和脚本update_instructions.yaml文件:
1 2
| b.c: 3 b.e[+].name: Howdy Partner
|
然后
1
| yq w -s update_instructions.yaml sample.yaml
|
输出
1 2 3 4
| b: c: 3 e: - name: Howdy Partner
|
当然,也可以使用管道命令:
1
| cat update_instructions.yaml | yq w -s - sample.yaml
|
以连字符(或短划线)开头的值
需要使用标志终止符来阻止应用程序尝试将后续参数解析为标志:
输出
带点号的Key
指定具有点号使用键查找指示符的键时。
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
|
返回