在TCL expect中使用变量名进行搜索';我找不到答案

在TCL expect中使用变量名进行搜索';我找不到答案,tcl,expect,Tcl,Expect,我通过一个Expect脚本执行telnet,并发送一些命令和下面的内容 expect -re {02 : (.*?)\s} set output $expect_out(1,string) puts "output is $output" =>输出为3(这是正确答案) =>输出为2(其他一些值,该值是$expect_out(1,字符串)中存在的旧值,用于搜索其他文本) 我是否可以将要搜索的文本保存在变量中并传递到expect re{….}? 我希望在变量中搜索文本,然后在expect中传递该变

我通过一个Expect脚本执行telnet,并发送一些命令和下面的内容

expect -re {02 : (.*?)\s}
set output $expect_out(1,string)
puts "output is $output"
=>输出为3(这是正确答案)

=>输出为2(其他一些值,该值是$expect_out(1,字符串)中存在的旧值,用于搜索其他文本)

我是否可以将要搜索的文本保存在变量中并传递到
expect re{….}
? 我希望在变量中搜索文本,然后在
expect
中传递该变量

我试过了,但没用

expect -re {($tests)(.*?)\s}

我相信你的问题是变量没有在大括号内展开。请尝试以下方法:

expect -re "${tests}(.*?)\\s"
比较以下各项之间的差异:

puts {"$tests"(.*?)\s}
# Output: "$tests"(.*?)\s
puts "${tests}(.*?)\\s"
# Output: 02 : (.*?)\s

大括号防止替换
$tests
的值,而只是将文本
$tests
作为正则表达式。引号确保您实际获得
$tests
的值。我添加了额外的大括号(使之成为
${tests}
),因为在其他情况下,paren被视为变量扩展的一部分。

@user108471为您提供了答案。以下是构建正则表达式的两个备选方案:

set tests "02 : "
set suffix {(.*?)\s}
set regex [string cat $tests $suffix]

expect -re $regex
set output $expect_out(1,string)
puts "output is $output"
这要求您的expect构建在Tcl 8.6.2(它引入了
string cat
命令)上:使用
expect-c'put[info patchlevel]验证

此外,您似乎希望非空白字符带有
(.*)\s
。这也可以通过
\S*
实现——这稍微简单一些:

set regex "${tests}(\\S*)"

你的直觉是正确的,我希望你能得到答案…但要小心!!!在逐块构建REs时必须小心。
expect
的一些特性可能会使这变得更难(在某些情况下它会做一些“聪明”的事情),但它应该像您在这里所说的那样工作。我还没有测试这一点。。非常感谢你
set regex "${tests}(\\S*)"