Как я могу создать линзу 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
не распознается.