0%

YAML处理工具yq之创建删除篇

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

创建

可以使用“new”命令创建Yaml文件。这与write命令的工作方式相同,但不需要传入已存在的Yaml文件。目前,不支持在单个yaml文件中创建多个文档。

1
yq n <path> <new value>

创建简单文件

1
yq n b.c cat

输出

1
2
b:
c: cat

使用脚本创建文件

创建脚本遵循与更新脚本相同的格式。

给定一个脚本create_instructions.yaml:

1
2
b.c: 3
b.e[+].name: Howdy Partner

然后

1
yq n -s create_instructions.yaml

输出

1
2
3
4
b:
c: 3
e:
- name: Howdy Partner

还可以使用管道方式创建:

1
cat create_instructions.yaml | yq n -s -

带点号的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 d <yaml_file> <path_to_delete>

写到标准输出

给出sample.yaml文件:

1
2
3
b:
c: 2
apples: green

然后

1
yq d sample.yaml b.c

输出

1
2
b:
apples: green

从标准输入读取

1
cat sample.yaml | yq d - b.c

删除数组元素

给出sample.yaml文件:

1
2
3
4
5
b:
c:
- 1
- 2
- 3

然后

1
yq d sample.yaml 'b.c[1]'

输出

1
2
3
4
b:
c:
- 1
- 3

删除节点

给出sample.yaml文件:

1
2
3
b:
c: 2
apples: green

然后

1
yq d -i sample.yaml b.c

将更新sample.yaml文件,以便删除“c”节点。

通配符

给出sample.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
---
bob:
item1:
cats: bananas
dogs: woof
item2:
cats: apples
dogs: woof2
thing:
cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.*.cats

输出

1
2
3
4
5
6
7
8
---
bob:
item1:
dogs: woof
item2:
dogs: woof2
thing:
dogs: woof3

前缀匹配

给出sample.yaml文件:

1
2
3
4
5
6
7
8
9
10
11
---
bob:
item1:
cats: bananas
dogs: woof
item2:
cats: apples
dogs: woof2
thing:
cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.item*.cats

输出

1
2
3
4
5
6
7
8
9
---
bob:
item1:
dogs: woof
item2:
dogs: woof2
thing:
cats: oranges
dogs: woof3

数组匹配

给出sample.yaml文件:

1
2
3
4
5
6
7
8
---
bob:
- cats: bananas
dogs: woof
- cats: apples
dogs: woof2
- cats: oranges
dogs: woof3

然后

1
yq d sample.yaml bob.[*].cats

输出

1
2
3
4
5
---
bob:
- dogs: woof
- dogs: woof2
- dogs: woof3

多文档 - 删除单个文档

给出sample.yaml文件:

1
2
3
4
5
6
something: else
field: leaveMe
---
b:
c: 2
field: deleteMe

然后

1
yq w -d1 sample.yaml field

输出

1
2
3
4
5
something: else
field: leaveMe
---
b:
c: 2

多文档 - 删除所有文档

给出sample.yaml文件:

1
2
3
4
5
6
something: else
field: deleteMe
---
b:
c: 2
field: deleteMeToo

然后

1
yq w -d'*' sample.yaml field

输出

1
2
3
4
something: else
---
b:
c: 2

请注意,’*’在引号中以避免被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