如何在近距离

时间:2015-06-22 11:50:05

标签: tcl expect

为什么以下内容与:

不匹配
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

2 个答案:

答案 0 :(得分:3)

这不是:的问题,而是问[

[对于TclExpect模式匹配器都是特殊的,所以它特别凌乱。要匹配文字[,您必须从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对于模式匹配器并不特殊)。

来源Exploring Expect

答案 1 :(得分:1)

对我有用的模式:

  • -exact {[1]:}
  • -exact "\[1]:"
  • {\[1]:}
  • "\\\[1]:"