Augeas:如何匹配破折号?

时间:2015-12-10 09:08:30

标签: regex escaping augeas

想为双重排除文件编写镜头。例如:

+ /etc
- /

所以我的镜头看起来像这样:

module DuplyExclude =
  let nl = del /[\n]+/ "\n"
  let entry = [ label "entry" . [ label "op" . store /(\+|-)/ ] . del /[ \t]+/ " " . [ label "path" . store /\/[^ \t\n\r]+/ ] ]
  let lns = ( entry . nl )*

  test lns get "+ /hello\n+ /etc\n- /" = ?

这会导致错误。我从实验中得知,正则表达式/(\+|-)/与第二行不匹配。问题是:为什么破折号似乎不匹配,即使被\转义?

1 个答案:

答案 0 :(得分:1)

这有两个原因:

  1. 测试字符串缺少尾随\n。这很重要,因为lns被定义为具有条目后跟无条件的新行。请注意,这只会影响使用augparse的字符串测试,因为当通过库加载文件时,它会向读入的任何文件添加尾随\ n(因为许多镜头无法处理丢失的EOL)。
  2. 路径节点被定义为匹配/中的单个+,后跟至少一个(store /\/[^ \t\n\r]+/)其他字符。这与单个/条目不匹配。
  3. 所以有了这两个变化,这个镜头就可以了:

    module DuplyExclude =
      let nl = del /[\n]+/ "\n"
      let entry = [ label "entry" . [ label "op" . store /(\+|-)/ ] . del /[ \t]+/ " " . [ label "path" . store /\/[^ \t\n\r]*/ ] ]
      let lns = ( entry . nl )*
    
      test lns get "+ /hello\n+ /etc\n- /\n" = ?
    
    Test result: /tmp/duplyexclude.aug:6.2-.44:
      { "entry"
        { "op" = "+" }
        { "path" = "/hello" }
      }
      { "entry"
        { "op" = "+" }
        { "path" = "/etc" }
      }
      { "entry"
        { "op" = "-" }
        { "path" = "/" }
      }