为什么以下内容与:
不匹配expect {
timeout {puts timedout\n}
\[1\]: {puts matched\n}
}
> expect test.tcl
[1]:
timedout
如果我更改它并删除冒号,则匹配起作用:
expect {
timeout {puts timedout\n}
\[1\] {puts matched\n}
}
$ expect test.tcl
[1]
matched
或者如果我摆脱了第一个支架
expect {
timeout {puts timedout\n}
1\]: {puts matched\n}
}
然后匹配:
$ expect test.tcl
1]:
matched
答案 0 :(得分:3)
这不是:
的问题,而是问[
。
[
对于Tcl
和Expect
模式匹配器都是特殊的,所以它特别凌乱。要匹配文字[
,您必须从Tcl
反斜杠一次,然后再次反复使其在模式匹配期间不被视为范围。当然,第一个反斜杠必须被反斜杠以防止它将下一个反斜杠转换成字面反斜杠!
expect "\\\[" ; #matches literal '['
所以,你的代码应该是,
expect {
timeout {puts timedout\n}
\\\[1]: {puts matched\n}
}
如果让你感觉良好,你可以在]
前加一个反斜杠,但事实并非如此
必要。因为没有匹配的左手支架可以匹配
双引号字符串,右侧括号没有什么特别之处。它代表自身并传递给Expect
命令,然后将其解释为范围的结尾。
下一组示例显示[
作为模式的行为,前面是不同数量的反斜杠。如果[
没有以反斜杠作为前缀,Tcl
会将后续内容解释为命令。对于这些示例,假设有一个名为XY
的过程返回字符串n*w
。
expect" [XY]" ; # matches n followed by anything
expect "\[XY]" ; # matches X or Y
expect "\\[XY]" ; # matches n followed by anything followed by w
expect "\\\[XY]" ; # matches [XYl
expect "\\\\[XY]" ; # matches \ followed by n followed ...
expect "\\\\\[XY]" ; # matches sequence of \ and X or Y
\\[XY]
案件值得密切关注。 Tcl
解释第一个反斜杠意味着第二个是文字字符。 Tcl
然后生成n*w
作为XY命令的结果。模式匹配器最终会看到四个字符串n*w
。模式匹配器以通常的方式解释这一点。反斜杠表示n
将按字面匹配(即使没有反斜杠也是如此,因为n对于模式匹配器并不特殊)。
答案 1 :(得分:1)
对我有用的模式:
-exact {[1]:}
-exact "\[1]:"
{\[1]:}
"\\\[1]:"