Regex 如何在TCL/expect中使用$expect\u out分配变量?

Regex 如何在TCL/expect中使用$expect\u out分配变量?,regex,tcl,expect,Regex,Tcl,Expect,如果要使用以下regexp匹配DEF_23: expect { -re "DEF_\[0-9]*" set result $expect_out(1,string) } 为什么它说数组中没有这样的元素? $expect\u out如何工作,我如何使用regexp捕获DEF,并将其分配给变量result?您正在寻找的expect\u out(0,string)——如果在正则表达式中捕获了括号,则将填充数组元素1,string 在expect命令的文档中记录expect\u out

如果要使用以下regexp匹配
DEF_23

expect {
    -re "DEF_\[0-9]*"
    set result $expect_out(1,string)
}
为什么它说数组中没有这样的元素?
$expect\u out
如何工作,我如何使用regexp捕获
DEF
,并将其分配给变量
result

您正在寻找的
expect\u out(0,string)
——如果在正则表达式中捕获了括号,则将填充数组元素
1,string

expect命令的文档中记录expect\u out的使用:

匹配模式(或eof或full_buffer)后,任何匹配和以前未匹配的输出都保存在变量expect_out(buffer)中。expect\u out(1,string)到expect\u out(9,string)变量中最多保存9个regexp子字符串匹配项。如果在模式之前使用-index标志,则10个字符串的起始和结束索引(以适合lrange的形式)存储在expect_out(X,start)和expect_out(X,end)变量中,其中X是数字,对应于缓冲区中的子字符串位置。0引用与整个模式匹配的字符串,该字符串是为glob模式以及regexp模式生成的


手册页中有一个示例。

上面的解释似乎不准确! 检查此示例:

$ 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\u out(1,字符串)或$expect\u out(缓冲区)时,测试结果相同。
我是否遗漏了什么或这是预期的行为?

Aleksandar-如果您将匹配项更改为“\ndb.*$”,它应该会起作用

如果打开exp\u internal 1,您将看到缓冲区包含如下内容:“ls-1 db*\r\ndbupgrade.log\r\n08:46:09”


因此,插入符号(^)将取消模式匹配。

您的意思是在
集合
行周围有额外的大括号吗?否则,
expect
确实是一个非常奇怪的用法……如果有人仍然好奇为什么上面的示例不起作用,请检查答案: