TCL期望美元符号锚匹配最后一个字符不工作



在TCL期望我需要逃避$使用它作为锚?例如,如果t出现在最后一个位置,那么匹配它应该是:

期待新台币

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

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

…但运气不好。帮助

当我在这里的时候,你如何匹配任何响应,并捕获整个响应,也就是说,我怀疑下面的东西

expect ^*$

但是我的$坏了

正如acheong87指出的那样,expect脚本在响应中包含换行符。要看到这一点,请使用glen jackman tip并将exp_internal 1添加到脚本的顶部。因此,如果字符"t"在最后一个位置,匹配它的方法是:

expect -re {tn$} 

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

expect -re {^.*.n$}

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

expect "abcrn$"

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

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

因此,要匹配缓冲区末尾的字符"t",首先必须确保在"t"之后有一个终止换行符,并且派生进程正在等待,或者以其他方式保证Expect的缓冲区不会被更多输入填充。
对于Expect,正确的命令应该是:

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

注意,美元符号前的反斜杠并不是真正必要的,我把它放在那里只是为了支持这样做的好习惯。

编辑:当然,与我第一次写的相反,换行符确实被传递给Expect,它似乎用"rn"代替。
我还想补充一点,我知道有一种情况下,生成的进程的缓冲区被刷新,即当进程终止时。因此,实际上不能保证新行的末尾就是缓冲区的当前末尾,但在大多数情况下确实如此。
如果您尝试等待一个比Expect脚本更早结束的程序的模式,您将获得该模式,并且在结尾没有任何换行符!
在这种情况下,您可以简单地将文本末尾的裸字符"t"与

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

最新更新