Expect中简单正则表达式匹配失败问题求助
解决Expect脚本中正则表达式的方括号解析错误
这个报错的核心原因是Expect基于Tcl语言,而Tcl中双引号包裹的字符串会执行命令替换——你写的[0-9]被Tcl当成了要执行0-9这个命令,但这个命令根本不存在,所以抛出了invalid command name "0-9"的错误,和正则表达式本身的语法无关。
两种修复方案:
- 用单引号包裹正则表达式
单引号在Tcl中是纯字符串,不会解析任何特殊字符(包括方括号、变量、命令替换),这是最简单的解决方式:
expect { -re 'root@[0-9]+:/#' }
- 转义方括号
如果一定要用双引号,需要给方括号加上反斜杠转义,注意在双引号里要写双反斜杠(因为Tcl会先解析一次反斜杠):
expect { -re "root@\\[0-9\\]+:/#" }
修正后的完整脚本
另外补充一点:send -- exit最好加上回车符\r,否则终端可能不会执行exit命令:
#!/usr/bin/expect set timeout 60 spawn docker run -it ubuntu:19.04 expect { -re 'root@[0-9]+:/#' } send -- exit\r expect eof
你提到这是合法的Perl风格正则,这点没错——Expect的正则引擎确实支持[0-9]这类字符类,问题完全出在Tcl的字符串解析规则上,和正则语法无关。
内容的提问来源于stack exchange,提问作者Kalle Richter
相关产品推荐
相关产品推荐

