Соответствие регулярному выражению в сценарии EXPECT - PullRequest
0 голосов
/ 09 июля 2019

У меня есть сценарий EXPECT, который отслеживает pid http на сервере IBMIHS:

    ....
    send "ps -ef|grep htt|grep start|wc -l \r"
    expect {
       -re {.*(\d+).*} {

          set theNum $expect_out(1,string)
      }
    }

    puts "theNum = $theNum"

    if {$theNum > 8} {
      puts "it is ok"
    } else {
      puts "it is not ok"
    }
....

send "ps -ef|grep htt|grep start|wc -l \r" генерирует:

send: отправка "ps -ef | grep htt | grep start | wc -l \ r" в {exp5}
Gate шаблон глобуса хранителя для '. (\ d +). ' is ''. Не используется, отключение повышение производительности.

Ожидается: "" (spawn_id exp5) соответствует регулярному выражению ". (\ d +). "? (Нет ворот, только RE) gate = yes re = no
ps -ef | grep htt | grep start | wc -l

Ожидается: "ps -ef | grep htt | grep start | wc -l \ r \ n" (spawn_id exp5) соответствует регулярное выражение ". (\ d +). "? (Нет ворот, только RE) gate = yes re = no
11

ожидайте: выводит ли "ps -ef | grep htt | grep start | wc -l \ r \ n 11 \ r \ n" (spawn_id exp5) соответствует регулярному выражению ". (\ d +). "? (Нет ворот, только RE) ворота = да повторно = да

Ожидаемо: установите функцию wait_out (0, строка) "ps -ef | grep htt | grep start | wc -l \ r \ n 11 \ r \ n "
Ожидайте: установите функцию ожидаемого выхода (1, строка) " 1 "
ожидать: установить wait_out (spawn_id) "exp5" ожидаемо: set wait_out (buffer) "ps -ef | grep htt | grep start | wc -l \ r \ n 11 \ r \ n "
theNum = 1
это не нормально

Командная строка на самом деле возвращает число " 11 ", но (\d+) вместо этого ловит один '1' .

Ваши комментарии приветствуются заранее.

1 Ответ

2 голосов
/ 09 июля 2019

Это происходит из-за жадности ведущего .* - потому что оно выскальзывает из максимально возможного числа символов, текст, оставшийся для части (\d+), представляет собой последнюю цифру. Вот демо, где я также запечатлел ведущую ". *":

expect1.11> exp_internal 1
expect1.12> spawn sh -c {echo foo; echo 1234; echo bar}
spawn sh -c echo foo; echo 1234; echo bar
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {78523}
78523
expect1.13> expect -re {(.*)(\d+).*}
Gate keeper glob pattern for '(.*)(\d+).*' is ''. Not usable, disabling the performance booster.

expect: does "" (spawn_id exp10) match regular expression "(.*)(\d+).*"? (No Gate, RE only) gate=yes re=no
foo
1234
bar

expect: does "foo\r\n1234\r\nbar\r\n" (spawn_id exp10) match regular expression "(.*)(\d+).*"? (No Gate, RE only) gate=yes re=yes
expect: set expect_out(0,string) "foo\r\n1234\r\nbar\r\n"
expect: set expect_out(1,string) "foo\r\n123"
expect: set expect_out(2,string) "4"
expect: set expect_out(spawn_id) "exp10"
expect: set expect_out(buffer) "foo\r\n1234\r\nbar\r\n"

Обратите внимание на то, что хранится в «1, строка» и «2, строка»

Решение состоит в том, чтобы упростить ваше регулярное выражение. Если вы просто хотите захватить первый набор цифр, используйте

expect -re {\d+}
set theNum $expect_out(0,string)

Или, если вы хотите захватить первые цифры , которые являются единственными символами в строке :

expect -re {\r\n(\d+)\r\n}
set theNum $expect_out(1,string)

Один урок здесь заключается в том, что в шаблонах регулярных выражений, как правило, вам не нужно вводить и заканчивать .* подстановочными знаками: просто сосредоточьтесь на том, что вам нужно, чтобы захватить нужный текст.

...