Augeas:如何匹配破折号?

Augeas: How to match dash?

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

+ /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. 测试字符串缺少尾随 \n。这很重要,因为 lns 被定义为有一个条目后跟一个无条件的新行。请注意,这只会真正影响使用 augparse 进行的字符串测试,因为当通过库加载文件时,它会向读入的任何文件添加尾随 \n(因为许多镜头无法处理丢失的 EOL)。
  2. 路径节点定义为匹配单个 / 后跟至少一个 (+) store /\/[^ \t\n\r]+/ 中的其他字符。这不会匹配单个 / 条目。

所以有了这两个变化,这个镜头就可以工作了:

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" = "/" }
  }