2 个版本

0.1.1 2020 年 7 月 12 日
0.1.0 2020 年 7 月 12 日

#23 in #matching

MIT/Apache

81KB
2K SLoC

ry

ry 在 yaml 中搜索匹配的路径/值。它用 Rust 编写,并受到 yq 的启发


用法

ry<yaml_file_name> <path_expression>

返回匹配 yaml_file_namepath_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