正则表达式在期待

时间:2016-05-16 11:28:16

标签: regex expect

我刚刚开始学习期望脚本。我一直试图从我的输出中提取以下内容:

core.4046140998.01.10.133211

使用以下命令使用expect脚本。有人请告诉我哪里出错了?我想将整个字符串即(core.4046140998.01.10.133211 *)存储在一个变量中并用它执行一些操作

expect -re {^(core)\.*} {puts $expect_out(0,string)}

我是否必须导入任何包以期使其工作?

2 个答案:

答案 0 :(得分:3)

由于这是预期的,“核心”可能出现在一行的开头,但不在输入字符串的开头。为了证明:

$ expect
expect1.1> spawn sh
spawn sh
8043
expect1.2> send "echo core.1234\r"
expect1.3> exp_internal 1
expect1.4> expect -re {^core.*}
Gate keeper glob pattern for '^core.*' is 'core*'. Activating booster.

expect: does "" (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=no
sh-4.3$ echo core.1234
core.1234
sh-4.3$ 
expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=yes re=no
expect: timed out
expect1.5> expect -re {(?n)^core.*}
Gate keeper glob pattern for '(?n)^core.*' is 'core*'. Activating booster.

expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "(?n)^core.*"? Gate "core*"? gate=yes re=yes
expect: set expect_out(0,string) "core.1234\r"
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "sh-4.3$ echo core.1234\r\ncore.1234\r"
expect1.6> puts ">>>$expect_out(0,string)<<<"
<<<core.1234

注意事项:

  • 期待-re {^core.*}不匹配。我们看到“超时”消息
  • 注意我们想要匹配的内容:

    expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=yes re=no
    # ............^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    它从我发送的命令开始,因此使用“普通”锚点将不起作用

  • 我期待的下一件事是-re {(?n)^core.*}确实匹配。

    • (?n)是一个很少使用的Tcl regex指令,告诉我们想要“新行敏感”匹配的正则表达式引擎。
    • 换行符敏感匹配意味着.与新行不匹配,并且(此处更相关)^可以在多行字符串中的换行符后立即匹配(类似于$ })
  • 请注意,我的puts命令的输出看起来很奇怪。这是由于$expect_out(0,string)结束时的回车。请注意这一点,并根据需要使用string trim

这里的外卖课程是:

  • 提取命令的输出可能很难预料到,因为提示和发送的命令可能会妨碍。
  • 使用expect expect来查看模式不匹配的原因。

答案 1 :(得分:1)

.之后您错过了\.

^(core)\..*(\*)$

\.匹配文字..匹配任何单个字符。

或者您可以使用非贪婪版本:

^(core)\.[^*]*(\*)$