Ожидайте сценариев: создание строки регулярного выражения из $ argv - PullRequest
0 голосов
/ 06 ноября 2019

Я пишу сценарий ожидания, который ищет строку в формате:

([0-9]*)\) sign-([0-9]*)-X16-2019-11-04-dash.tar.xyz.abc

например:

106) sign-496-X16-2019-11-04-dash.tar.xyz.abc

в TUI и получает часть перед «)»[через переменную $expect_out(1,string)] и отправляет ее в TUI.

Однако часть даты является переменной [ 2019-11-04 ], и ожидаемый сценарий получает ее как ввод через $ARGV. Я пытался выяснить правильные шаблоны escape, чтобы правильно соединить строки, чтобы регулярное выражение работало. До сих пор я пробовал:

set inputStr [lindex $argv 0] 
expect -re {([0-9]*)\) sign-([0-9]*)-X16-\"$inputStr\"-dash.tar.xyz.abc} {....}

и

set inputStr [lindex $argv 0] 
expect -re {([0-9]*)\) sign-([0-9]*)-X16-{$inputStr}-dash.tar.xyz.abc} {....}

, но они не соответствуют ни одной строке в TUI. Что я делаю не так?

1 Ответ

1 голос
/ 06 ноября 2019

Проблема в том, что вы заключаете RE в фигурные скобки, которые подавляют все замены. Заключение в фигурные скобки - это хорошая вещь для RE в целом, так как они обычно содержат обратную косую черту и квадратные скобки и так далее, но это проблема для вас. Самый простой способ исправить это - добавить собственную замену, используя string map:

set inputStr [lindex $argv 0] 
set RE {([0-9]*)\) sign-([0-9]*)-X16-\"%inputStr%\"-dash.tar.xyz.abc}
expect -re [string map [list "%inputStr% $inputStr] $RE] {....}
...