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- /" = ?
这会导致错误。我通过一些实验知道,正则表达式 /(\+|-)/
与第二行不匹配。问题是:为什么破折号似乎无法匹配,即使被 \
?
转义
有两个原因:
- 测试字符串缺少尾随
\n
。这很重要,因为 lns
被定义为有一个条目后跟一个无条件的新行。请注意,这只会真正影响使用 augparse 进行的字符串测试,因为当通过库加载文件时,它会向读入的任何文件添加尾随 \n(因为许多镜头无法处理丢失的 EOL)。
- 路径节点定义为匹配单个
/
后跟至少一个 (+
) 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" = "/" }
}
想为双重排除文件编写镜头。示例:
+ /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- /" = ?
这会导致错误。我通过一些实验知道,正则表达式 /(\+|-)/
与第二行不匹配。问题是:为什么破折号似乎无法匹配,即使被 \
?
有两个原因:
- 测试字符串缺少尾随
\n
。这很重要,因为lns
被定义为有一个条目后跟一个无条件的新行。请注意,这只会真正影响使用 augparse 进行的字符串测试,因为当通过库加载文件时,它会向读入的任何文件添加尾随 \n(因为许多镜头无法处理丢失的 EOL)。 - 路径节点定义为匹配单个
/
后跟至少一个 (+
)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" = "/" } }