как работает $expect out в TCL / EXPECT?
Если я хочу соответствовать DEF_23
используя следующее регулярное выражение:
expect {
-re "DEF_[0-9]*"
set result $expect_out(1,string)
}
почему в массиве нет такого элемента?
как работает этот $ expect_out? и если я хочу назначить результат как DEF
, Как получить DEF с помощью regexp и назначить переменному результату?
3 ответов
вы ищете expect_out(0,string)
-- элемент массива 1,string
будет заполнено, если у вас есть захват скобок в регулярном выражении.
на ожидать manpage документы использование expect_out в документации ожидал:
при сопоставлении шаблона (или eof или full_buffer) любой соответствующий и ранее непревзойденный вывод сохраняется в переменной expect_out(буфер). Вверх до 9 совпадений подстроки regexp сохраняются в переменных expect_out(1,строка) через expect_out(9,строка). Если -индексов флаг используется перед шаблоном, начальным и конечным индексами (в форме, подходящей для lrange) из 10 строк хранятся в переменных expect_out (X,start) и expect_out (X,end) где X-цифра, соответствует позиции подстроки в буфере. 0 относится к строки, которые соответствуют всему шаблону и генерируются для шаблонов glob, а также шаблонов regexp.
в manpage есть иллюстративный пример.
Кажется, что приведенное выше объяснение не является точным! Проверьте этот пример:
$ cat test.exp
#!/usr/bin/expect
set timeout 5
log_user 0
spawn bash
send "ls -1 db*\r"
expect {
-re "^db.*$" {
set bkpfile $expect_out(0,string)
}
}
send_user "The filename is: $bkpfile\n"
close
$ ls -1 db*
dbupgrade.log
$ ./test.exp
can't read "bkpfile": no such variable
while executing
"send_user "The filename is: $bkpfile\n""
(file "./test.exp" line 15)
$
результат теста тот же,когда используется $expect_out(1, string) или $expect_out(buffer). Я что-то упускаю или это ожидаемое поведение?
Aleksandar-он должен работать, если вы измените матч на " \ndb.*$".
Если вы включите exp_internal 1, вы увидите, что буфер содержит что-то вроде этого: "ls -1 db*\r\ndbupgrade.log\r\n08: 46: 09"
Итак, каретка ( ^ ) сбросит ваш шаблон.