Назад | Перейти на главную страницу

Круглая скобка вокруг стоимости с объективом Augeas?

Как я могу создать линзу Augeas, которая позволит мне извлекать поле значений из скобок?

Задний план:

Я начинаю использовать Augeas для управления файлами NASL для OpenVAS. Мне нужно внести несколько произвольных изменений в большое количество этих скриптов.

NASL содержит множество пар ключ и значение, которые все заключены в круглые скобки, как показано ниже, иногда с несколькими значениями.

Это образец строки, с которой я работаю. Я пока не использую разрывы строк, комментарии и т. Д. В моем тестовом скрипте. Линия здесь как раз то, что я использую.

script_id(100197)

Базовый формат, который я пытаюсь использовать для извлечения:

let digits = store /\d+/
let oparen = Util.del_str "("
let cparen = Util.del_str ")"
(* script_id(100197); *)
let script_id = [  key "script_id" .  oparen  . digits . cparen  ]

И результирующая ошибка от augparse:

Error encountered at 1:0 (0 characters into string)
                           <|=|script_id(100197)>

Tree generated so far:
<blank>

Первый вопрос, который вам нужно задать, - какое дерево вы хотите создать из этой строки. Как вы ожидаете, что Авгий будет разбирать script_id(100197).

Предполагая, что вы хотите проанализировать его, например:

{ "script_id" = "100197" }

вы можете проанализировать это с помощью следующего кода:

let script_id =
     let oparen = Util.del_str "("
  in let cparen = Util.del_str ")"
  in [ key "script_id"
     . oparen . store Rx.integer . cparen
     . Util.eol ]

Вы можете добавить модульный тест, чтобы проверить его работу:

test script_id get "script_id(100197)\n" = ?

и запуск augparse в файле:

$ augparse openvas.aug 
Test result: openvas.aug:10.0-.44:
  { "script_id" = "100197" }

Обратите внимание, что Augeas поддерживает только базовые регулярные выражения POSIX, поэтому \d не распознается.