tcl期望美元符号锚点匹配最后一个不起作用的字符

时间:2013-01-13 01:05:05

标签: regex tcl expect

在TCL Expect中我是否需要转义$以将其用作锚点?例如,匹配t如果它出现在最后位置应该是:

期待t $

但这不起作用,我怀疑是因为TCL正在解释$。我没有成功地尝试了以下所有内容

expect -re {t$}
expect t\$
expect t\\$

......但没有运气。帮助

虽然我在这,但你如何匹配任何回应,并捕获整个回应,即我怀疑如下

expect ^*$

但我的$已被破坏。

2 个答案:

答案 0 :(得分:0)

正如acheong87所指出的,期望脚本在回复中包含换行符。要查看此内容,请使用glen jackman提示并将exp_internal 1添加到脚本顶部。 所以匹配字符“t”如果它在最后位置是:

expect -re {t\n$} 

以及捕获任何响应和整个响应的一种方法是

expect -re {^.*.\n$}

答案 1 :(得分:0)

在大多数情况下,您不必这样做,但请继续阅读。 Expect基本上是一个带有一些扩展的TCL shell。 TCL使用美元符号($)执行变量替换当且仅当在TCL dodekalogue中描述的3个上下文之一中找到它时(http://wiki.tcl.tk/10259 )。 简而言之,它们是$ name,$ {name}和$ name(name)表单。 当TCL解释器处理您的脚本时,它将替换美元符号,但如果不满足上述条件,则将其保留为字面形式,例如,

expect "abc\r\n$"

除非您使用大括号语法,否则不能使用以双引号开头或包含双引号作为变量名称的任何内容。 然而,无论如何,通过反斜杠逃避美元符号是明智的。
我想要注意的是,在我的旧版Expect(5.25.0)中,正则表达式处理器不执行反斜杠转义替换,因此如果您使用的是这样的版本,则无法使用大括号来转义换行符。在Expect(TCL)完成替换并开始正则表达式匹配之后,必须有一个文字换行符,这是通过让Expect替换\n来实现的。

由于Expect的正则表达式不是面向行的,而是面向缓冲区的,^$分别表示缓冲区的开始和缓冲区的结束。
取决于您的终端的缓冲模式,Expect可能只逐行获取生成的进程的输出(就像我的,大多数情况下),尽管没有换行符
这保证了(编辑:没有真正保证,看到结束)缓冲区的当前结束总是与生成进程的输出中的行的结尾一致。
另一个问题是(至少我的UNIX版本)Expect与换行符与\n不匹配,而只与\r\n匹配!
即。它似乎将这两个字符放在它获取的每个输入块的末尾(编辑:实际上,替换正常的换行符)。

所以要匹配角色' t'在缓冲区的末尾,首先你必须确保在“缓冲区”后面有一个终止换行符。并且生成的进程正在等待或以其他方式保证Expect的缓冲区不会充满更多输入。
在Expect方面,正确的命令是:

expect -re "t\r\n\$" {...}

请注意,美元符号之前的反斜杠并非真的有必要,我只是把它放在那里以支持这样做的好习惯。

编辑:当然,新行确实传递给了Expect,这与我最初编写的内容相反,它似乎替代了" \ r \ n"。
我还想补充说,我知道有一个案例,即生成的进程的缓冲区被刷新,即进程终止时。因此,实际上并不能保证新行的结尾是缓冲区的当前末尾,但在大多数情况下都是如此。
如果您尝试等待比Expect脚本更早结束的程序的模式,您将获得模式,最后没有任何换行符!
在这种情况下,您可以匹配裸露的角色' t'在文本的末尾简单地用

expect -re "t$" {...}