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