期望中的正则表达式
Regular expressions in expect
我刚开始学习 expect scripting.I 一直在尝试从我的输出中提取以下内容:
core.4046140998.01.10.133211
期望脚本使用以下 command.can 有人请告诉我哪里出错了吗?我想存储整个字符串,即(core.4046140998.01.10.133211*)在一个变量中并执行一些动作。
expect -re {^(core)\.*} {puts $expect_out(0,string)}
我是否必须导入任何包才能使这项工作正常进行?
您在 \.
之后错过了一个 .
:
^(core)\..*(\*)$
\.
匹配文字 .
并且 .
匹配任何单个字符。
或者你可以使用非贪婪版本:
^(core)\.[^*]*(\*)$
因为这是 expect,"core" 可能会出现在一行的开头,但 不会出现在输入字符串的开头 。演示:
$ 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.*}
不匹配。我们看到 "timed out" 消息
请注意我们要匹配的内容:
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
# ............^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
它以我发送的命令开始,所以使用 "normal" 锚点将不起作用
接下来我期待的是-re {(?n)^core.*}
。 匹配。
-
(?n)
是一个很少使用的 Tcl regex 指令,它告诉正则表达式引擎我们想要 "newline-sensitive" 匹配。
- 换行敏感匹配意味着
.
不会匹配换行符并且(此处更相关)^
可以在多行字符串中的换行符之后立即匹配(类似于 $
)
- 请注意,我的
puts
命令的输出看起来很奇怪。这是由于 $expect_out(0,string)
末尾的回车 return。请注意这一点,并根据需要使用 string trim
这里的外带课程是:
- 提取命令的输出可能很难,因为提示和发送的命令可能会妨碍。
- 使用 expect 调试来查看您的模式不匹配的原因。
我刚开始学习 expect scripting.I 一直在尝试从我的输出中提取以下内容:
core.4046140998.01.10.133211
期望脚本使用以下 command.can 有人请告诉我哪里出错了吗?我想存储整个字符串,即(core.4046140998.01.10.133211*)在一个变量中并执行一些动作。
expect -re {^(core)\.*} {puts $expect_out(0,string)}
我是否必须导入任何包才能使这项工作正常进行?
您在 \.
之后错过了一个 .
:
^(core)\..*(\*)$
\.
匹配文字 .
并且 .
匹配任何单个字符。
或者你可以使用非贪婪版本:
^(core)\.[^*]*(\*)$
因为这是 expect,"core" 可能会出现在一行的开头,但 不会出现在输入字符串的开头 。演示:
$ 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.*}
不匹配。我们看到 "timed out" 消息 请注意我们要匹配的内容:
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 # ............^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
它以我发送的命令开始,所以使用 "normal" 锚点将不起作用
接下来我期待的是
-re {(?n)^core.*}
。 匹配。-
(?n)
是一个很少使用的 Tcl regex 指令,它告诉正则表达式引擎我们想要 "newline-sensitive" 匹配。 - 换行敏感匹配意味着
.
不会匹配换行符并且(此处更相关)^
可以在多行字符串中的换行符之后立即匹配(类似于$
)
-
- 请注意,我的
puts
命令的输出看起来很奇怪。这是由于$expect_out(0,string)
末尾的回车 return。请注意这一点,并根据需要使用string trim
这里的外带课程是:
- 提取命令的输出可能很难,因为提示和发送的命令可能会妨碍。
- 使用 expect 调试来查看您的模式不匹配的原因。