0%

YAML处理工具yq之匹配合并和转换

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

通配符

路径可以使用’prefix’命令作为前缀。完整的yaml内容将嵌套在新的前缀路径中。

1
yq p <yaml_file> <path>

写到标准输出

给出sample.yaml文件:

1
2
a: simple
b: [1, 2]

然后

1
yq p data1.yaml c

输出

1
2
3
c:
a: simple
b: [1, 2]

任意深度

给定data1.yaml文件:

1
2
a:
b: [1, 2]

然后

1
yq p data1.yaml c.d

输出

1
2
3
4
c:
d:
a:
b: [1, 2]

更新文件

给定data1.yaml文件:

1
2
a: simple
b: [1, 2]

然后

1
yq p -i data1.yaml c

将更新data1.yaml文件,以便路径’c’作为所有其他路径的前缀。

多文档 - 增加前缀到单个文档

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

然后

1
yq p -d1 data1.yaml c

输出

1
2
3
4
5
something: else
---
c:
a: simple
b: cat

多文档 - 增加前缀到所有文档

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

然后

1
yq p -d'*' data1.yaml c

输出

1
2
3
4
5
6
c:
something: else
---
c:
a: simple
b: cat

合并

可以使用’merge’命令合并Yaml文件。与第一个文件合并的每个附加文件将为任何尚未存在的key或没有值的key设置值。

1
yq m <yaml_file> <path>...

写到标准输出

给出data1.yaml文件:

1
2
a: simple
b: [1, 2

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m data1.yaml data2.yaml

输出

1
2
3
4
a: simple
b: [1, 2]
c:
test: 1

更新文件

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m -i data1.yaml data2.yaml

将更新data1.yaml文件,将’c’的值为’test:1’。

覆盖值

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data2.yaml文件:

1
2
3
a: other
c:
test: 1

然后

1
yq m -x data1.yaml data2.yaml

输出

1
2
3
4
a: other
b: [1, 2]
c:
test: 1

覆盖数组值

给出data1.yaml文件:

1
2
a: simple
b: [1, 2]

和data3.yaml文件:

1
2
3
4
5
b: [3, 4]
c:
test: 2
other: true
d: false

然后

1
yq m -x data1.yaml data3.yaml

输出

1
2
3
4
5
6
a: simple
b: [3, 4]
c:
test: 2
other: true
d: false

请注意,’b’不会导致数组中值的合并

追加数组值

给出data1.yaml文件:

1
2
3
a: simple
b: [1, 2]
d: hi

和data3.yaml文件:

1
2
3
4
5
a: something
b: [3, 4]
c:
test: 2
other: true

然后

1
yq m -a data1.yaml data3.yaml	

输出

1
2
3
4
5
6
a: simple
b: [1, 2, 3, 4]
c:
test: 2
other: true
d: hi

请注意,’b’数组已连接第二个数据文件中的值。另请注意,其他map键不会被覆盖(字段a)。

Append不能与overwrite一起使用,如果给出了两个标志,则忽略append。

多文档 - 合并单个文档

目前,yq仅对要合并的第一个文档提供多文档支持。剩余的yaml文件将选择其第一个文档。

给出data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

和data3.yaml文件:

1
b: dog

然后

1
yq m -x -d1 data1.yaml data3.yaml

输出

1
2
3
4
something: else
---
a: simple
b: dog

多文档 - 合并所有文档

目前,yq仅对要合并的第一个文档提供多文档支持。剩余的yaml文件将选择其第一个文档。

给定data1.yaml文件:

1
2
3
4
something: else
---
a: simple
b: cat

和data3.yaml文件:

1
b: dog

然后

1
yq m -x -d'*' data1.yaml data3.yaml

输出

1
2
3
4
5
b: dog
something: else
---
a: simple
b: dog

转换

Yaml到Json

将输出转换为json,请使用–tojson(或-j)标志。这只能与read命令一起使用。

给出sample.yaml文件:

1
2
b:
c: 2

然后

1
yq r -j sample.yaml b.c

输出

1
{"b":{"c":2}}

Json到Yaml

要读入json,只需传入一个json文件而不是yaml,它就可以工作了:)

例如给出一个json文件:

1
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}

然后

1
yq r sample.json

输出

1
2
3
4
5
6
a: Easy! as one two three
b:
c: 2
d:
- 3
- 4