tcl,正则表达式匹配字符串

时间:2014-03-15 20:40:04

标签: tcl expect

我的tcl脚本有问题。在代码的一部分我grep一个字符串形式包含ipadress的xml.file(见下文),现在我需要将表达式与expect -re i匹配到下一行,这样我就可以将它保存到varible。所以我需要你的帮助,如何匹配,请参阅下面的意思。 这是TCL代码的一部分:

  send -- "cat $filename | grep 'url' \r"
  expect -re "(\<emUrl url=\"(\[0-9]{1,3})\.(\[0-9]{1,3})\.(\[0-9]{1,3})\.(\[0-9]{1,3})\"\/\>\).*ranosusr@rn2osscs603>$"
   set IP $expect_out(1,string)

问题是我不知道如何匹配这个表现,这是grep的结果:

<emUrl url="10.80.31.123"/>

ipaddress应该是通用的,因为它们与文件不同。

使用exp_internal 1我获得此输出: 结束:发送“cat FXL704_FRTAMX_SIU_ARNE.xml | grep'url'\ _ r”到{exp4}

expect: does "> " (spawn_id exp4) match regular expression "(<emUrl url="(.*)").*ranosusr@rn2osscs603>$"? no
cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url'

expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url' \r\r\n" (spawn_id exp4) match regular expression "(<emUrl url="(.*)").*ranosusr@rn2osscs603>$"? no
                  <emUrl url="10.80.31.123"/>

expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url' \r\r\n                  <emUrl url="10.80.31.123"/>\r\r\n" (spawn_id exp4) match regular expression "(<emUrl url="(.*)").*ranosusr@rn2osscs603>$"? no
ranosusr@rn2osscs603>
expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url' \r\r\n                  <emUrl url="10.80.31.123"/>\r\r\nranosusr@rn2osscs603> " (spawn_id exp4) match regular expression "(<emUrl url="(.*)").*ranosusr@rn2osscs603>$"? no
expect: timed out

expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url' \r\r\n                  <emUrl url="10.80.31.123"/>\r\r\nranosusr@rn2osscs603> " (spawn_id exp4) match regular expression "(<emUrl url="([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})"/>).*ranosusr@rn2osscs603>$"? no
expect: timed out

所以看看我的代码,我想可能需要一些我无法弄清楚的括号。此外,我必须包含ranosusr@rn2osscs603>,因为这是服务器提示符。 请帮助:)

1 个答案:

答案 0 :(得分:2)

据我所知(仔细查看该日志),正则表达式的主要问题是它包含一个文本结束/行锚点{{1}但是在任何时候匹配的字符串都不包含那个;要么你的RE中没有该锚点之前的文本,要么它后面有一个空格。至少,请尝试$(嗯,\s$),以便空间不会造成问题。

您可以考虑使用非贪婪的RE来简化RE。这是我认为可以工作的(没有Tcl语法反斜杠;将它放在\\s$大括号{中,以便将其提供给},而不必对其进行反斜杠 - itis)。

expect

如果您需要引用Tcl支持的RE语言变体,请查看re_syntax(n)手册页。


好的,(<emUrl url="(.*?)"/>).*ranosusr@rn2osscs603>\s*$ 默认情况下通常是EOT锚点,但Expect强制RE引擎处于EOL模式。这是正确的事。