在TCL expect中使用变量名进行搜索';我找不到答案
我通过一个Expect脚本执行telnet,并发送一些命令和下面的内容在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 -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*)"