2015-12-10 2 views
0

Хотите написать объектив для файлов без дублирования. Пример: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

Есть две причины для этого:

  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" = "/" } 
    } 
Смежные вопросы