2 个版本
0.1.1 | 2020 年 7 月 12 日 |
---|---|
0.1.0 | 2020 年 7 月 12 日 |
#23 in #matching
81KB
2K SLoC
ry
ry 在 yaml 中搜索匹配的路径/值。它用 Rust 编写,并受到 yq 的启发
用法
ry<yaml_file_name> <path_expression>
返回匹配 yaml_file_name
和 path_expression
的节点。有关 path_expression
的示例,请参阅 基本。
基本
对于包含以下内容的文件 test_map.yml
a:
b: 1
然后
ry test_map.yml 'a.b'
将返回 1
。
对于包含以下内容的文件 test_array.yml
letters:
- a
- b
然后
ry test_array.yml 'letters[1]'
将返回 b
。
从 STDIN
对于上面的 test_map.yml
文件,以下内容
cat test.yml | target/release/ry - 'a.b'
将返回 1
。请注意,-
字符代表 STDIN
。
通配符匹配
通配符字符 '*'
在路径表达式中充当通配符。对于包含以下内容的文件 test_wild.yml
a:
item_b:
f: 1
thing_c:
f: 2
item_d:
f: 3
然后
ry test_wild.yml 'a.*.f'
将返回
1
2
3
您还可以使用带有前缀的通配符,例如
ry test_wild.yml 'a.item*.f'
将返回
1
3
最后,通配符也可以用于匹配数组元素。对于包含以下内容的文件 test_wild_array.yml
letters:
- a
- b
- c
然后
ry test_wild_array.yml 'letters[*]'
将返回
a
b
c
深度展开匹配
深度展开模式 '**'
用于递归匹配文件中的节点。对于包含以下内容的文件 test_splat.yml
a:
b1:
c: # MATCH
c: crabs_1 # MATCH
d: bears
b2:
c: crabs_2
d: bears
b3:
e:
- f:
c: crabs_3 # MATCH
g: bears
- f:
g:
c: crabs_4 # MATCH
h: bears
- f: bears
然后
ry test_splat.yml 'a.**.c'
将返回
crabs_1
c: crabs_1
crabs_2
crabs_3
crabs_4
打印匹配路径
--printMode
功能标志允许您打印到匹配节点的路径。对于包含以下内容的文件 test_wild.yml
a:
item_b:
f: 1
thing_c:
f: 2
item_d:
f: 3
然后
ry test_wild.yml 'a.*.f' --printMode p
将返回
a.item_b.f
a.thing_c.f
a.item_d.f
而
ry test_wild.yml 'a.*.f' --printMode pv
将返回匹配路径和值
a.item_b.f: 1
a.thing_c.f: 2
a.item_d.f: 3
请注意
ry test_wild.yml a.*.f --printMode v
是等效的默认值
ry test_wild.yml 'a.*.f'
它只会返回匹配值
1
2
3
多文档支持
如果您在单个 yaml 文件中拥有多个文档,则 -d
功能标志允许您将搜索应用于特定文档。默认情况下,将搜索所有文档。
对于包含以下内容的文件 test_multi_doc.yml
a:
b: 1
crabs: here
---
a:
b: 2
然后
ry test_multi_doc.yml 'a.b' -d1
将返回 2
,而
ry test_multi_doc.yml 'a.b' -d0
将返回 1
。最后
ry test_multi_doc.yml 'a.b' -d'*'
将返回
1
2
将结果收集到数组中
功能标志 --collect
会将输出元素收集到数组中。对于包含以下内容的文件 test_collect.yml
:
letters:
a:
crab: 1
b:
crab: 2
c:
crab: 3
然后
ry test_collect.yml 'letters.*.crab'
将返回
1
2
3
而
ry test_collect.yml 'letters.*.crab' --collect
将返回
- 1
- 2
- 3
打印结果长度
功能标志 --length
会打印结果的长度。
对于数组,长度表示元素的数量。对于包含以下内容的文件 test_array_length.yml
:
looking:
- here
- there
- elsewhere
然后
ry test_array_length.yml 'looking' --length
将返回 3
。
对于映射,长度表示条目的数量。对于包含以下内容的文件 test_map_length.yml
:
looking:
here: yes
there: yes
elsewhere: no
然后
ry test_map_length.yml 'looking' --length
将返回 3
。
最后,对于标量,长度表示标量的长度。对于包含以下内容的文件 test_string_length.yml
:
looking: string
然后
ry test_string_length.yml 'looking' --length
将返回 6
。对于包含以下内容的文件 test_int_length.yml
:
looking: 100
然后
ry test_int_length.yml 'looking' --length
将返回 3
。
锚点和别名
锚点和别名将自动替换。这意味着对于包含以下内容的文件 anchor_and_alias.yml
:
first: &crab
a: b
second: *crab
然后
ry anchor_and_alias.yml 'second.a'
将返回 b
。
高级
根据子节点过滤
您可以根据父节点的子节点进行过滤。对于包含以下内容的文件 test_filter.yml
:
a:
- b:
c: magic
d: crab
- b:
c: magically
d: bear
- b:
c: magic
d: more crab
- b:
careful: magic
d: most crab
然后
ry test_filter.yml 'a.(b.c==magic).d' --printMode pv
将返回
a[0].d: crab
a[2].d: more crab
请注意,
(b.c==magic)
根据位于a
下的每个数组成员的子节点进行过滤,但它返回这些子节点的父节点以进行进一步搜索(即,过滤(b.c==magic)
返回位于a
下的数组成员)。
过滤也支持通配符,例如
ry test_filter.yml 'a.(b.c*==magic*).d' --printMode pv
将返回
a[0].d: crab
a[1].d: bear
a[2].d: more crab
a[3].d: most crab
匹配子节点值
类似于根据子节点过滤,也可以根据子节点值进行过滤。
对于数组,这意味着匹配数组中的值。对于包含以下内容的文件 matching_array.yml
:
crabs:
- abby
- carl
- alexandra
然后
ry matching_array.yml 'crabs(.==a*)' --printMode pv
将返回
crabs[0]: abby
crabs[2]: alexandra
对于映射,这意味着匹配映射条目的值。对于包含以下内容的文件 matching_map.yml
:
crabs:
name_1: abby
name_2: carl
name_3: alexandra
然后
ry matching_map.yml 'crabs(.==a*)' --printMode pv
将返回
crabs.name_1: abby
crabs.name_3: alexandra
请注意,这忽略了映射条目的键。
过滤结果长度
过滤结果的长度将分别打印。对于包含以下内容的文件 test_filtered_length.yml
:
crabs:
- abby
- carl
- alexandra
然后
ry test_filtered_length.yml 'crabs(.==a*)' --printMode pv --length
将返回
crabs[0]: 4
crabs[2]: 9
然而,如果您想了解过滤结果的总数,可以使用 --collect
和 --length
功能标志一起。然后
ry test_filtered_length.yml 'crabs(.==a*)' --length --collect
将返回 2
。
依赖关系
~1MB
~13K SLoC