我刚刚开始学习期望脚本。我一直在尝试从输出中提取以下内容:
core.4046140998.01.10.133211
使用以下命令使用期望脚本。有人可以告诉我哪里出了问题吗?我想将整个字符串(即 core.4046140998.01.10.133211*)存储在变量中并用它执行一些操作。
expect -re {^(core)\.*} {puts $expect_out(0,string)}
我是否必须导入任何软件包才能使其正常工作?
由于这是预期的,“核心”可能会出现在行的开头,但是不在输入字符串的开头。展示:
$ 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.*}
. This does match.
- the
(?n)
是一个很少使用的Tcl 正则表达式告诉正则表达式引擎我们想要“换行敏感”匹配的指令。
- 换行敏感匹配意味着
.
不会匹配换行符并且(这里更相关)^
可以在多行字符串中的换行符之后立即匹配(类似地$
)
- 请注意我的输出
puts
命令看起来很奇怪。这是由于末尾的回车$expect_out(0,string)
。请注意这一点,并使用string trim
按要求
这里的要点是:
- 提取命令的输出可能会很困难,因为提示和发送的命令可能会妨碍。
- 使用期望调试来查看模式不匹配的原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)