0%

YAML处理工具yq之读写篇

yq是一个轻量级的便携式命令行YAML处理器。该工具的目标是成为yaml文件处理方面的jq或sed。

读取

1
yq r <yaml_file|json_file> <path>

此命令也可以将json文件作为输入,并将输出yaml,除非指定导出为json(-j)

基本操作

给出sample.yaml文件:

1
2
b:
c: 2

然后

1
yq r sample.yaml b.c

将输出值’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

输出

1
2
- bananas
- apples

多文档 - 指定单个文档

给出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'

输出

1
2
- fred
- sam

请注意,路径是引号,以避免shell解释方括号。

带点号的Key

指定具有点号使用键查找指示符的键时。

1
2
b:
foo.bar: 7
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
2
b:
c: 2

然后

1
yq w sample.yaml b.c cat

输出

1
2
b:
c: cat

从标准输入读取

1
cat sample.yaml | yq w - b.c blah

添加新字段

路径中的任何缺少的字段都将动态创建。

给出sample.yaml文件:

1
2
b:
c: 2

然后

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
2
b:
c: 2

然后

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

以连字符(或短划线)开头的值

需要使用标志终止符来阻止应用程序尝试将后续参数解析为标志:

1
yq w -- my.path -3

输出

1
2
my:
path: -3

带点号的Key

指定具有点号使用键查找指示符的键时。

1
2
b:
foo.bar: 7
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