问题
I just started learning expect scripting.I have been trying to extract the following from my output:
core.4046140998.01.10.133211
with an expect script using the following command.can somebody please tell me where I am going wrong?I want to get to store this entire string i.e.( core.4046140998.01.10.133211*) in a variable and perform some action with it.
expect -re {^(core)\.*} {puts $expect_out(0,string)}
Do i have to import any packages in expect to make this work?
回答1:
Since this is expect, "core" may appear at the beginning of a line, but not at the beginning of the input string. To demonstrate:
$ 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
Things to note:
- expecting
-re {^core.*}
did not match. We see the "timed out" message note what we're attempting to match:
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 # ............^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It starts with the command I sent, so using a "normal" anchor won't work
the next thing I expect is
-re {(?n)^core.*}
. This does match.- the
(?n)
is a little-used Tcl regex instruction that tells the regex engine we want "newline-sensitive" matching. - newline-sensitive matching means that
.
will not match a newline and (more relevant here) that^
can match immediately after a newline within a multi-line string (similarly for$
)
- the
- note that the output of my
puts
command looks odd. That's due to the carriage return at the end of$expect_out(0,string)
. Be aware of that, and usestring trim
as required
The take-away lessons here are:
- extracting the output of commands can be hard in expect because the prompt and the sent command can get in the way.
- use expect debugging to see why your patterns aren't matching.
回答2:
You have missed a .
after \.
:
^(core)\..*(\*)$
\.
matches a literal .
and .
matches any single character.
Or you can use the non-greedy version:
^(core)\.[^*]*(\*)$
来源:https://stackoverflow.com/questions/37252842/regular-expressions-in-expect