2012-06-15 18 views
6

Si quiero coincidir DEF_23 utilizando la siguiente expresión regular:

expect { 
    -re "DEF_\[0-9]*" 
    set result $expect_out(1,string) 
} 

por qué no dice tal elemento en la matriz? cómo funciona $ expect_out? y si deseo asignar el resultado como DEF, ¿cómo obtener el DEF usando regexp y asignarle el resultado de la variable?

+1

¿Quisiste tener llaves adicionales alrededor de la línea 'set'? De lo contrario, es un uso muy extraño de 'esperar' de hecho ... –

Respuesta

9

Está buscando expect_out(0,string) - el elemento de matriz 1,string se completará si tiene la captura de paréntesis en su expresión regular.

El expect manpage documenta el uso de expect_out en la documentación de la esperar comando:

Tras la combinación de una estampa (o EOF o full_buffer), cualquier juego y de salida previamente sin igual se guarda en la variable expect_out (buffer). Se guardan hasta 9 coincidencias de subcadena regexp en las variables expect_out (1, cadena) hasta expect_out (9, cadena). Si el -indices bandera se utiliza antes de un patrón, la partida y los índices que terminan (en una forma adecuada para lrange) de las 10 cadenas se almacenan en las variables expect_out (X, iniciar) y expect_out (X , final) donde X es un dígito, corresponde a la posición de la subcadena en el búfer. 0 se refiere a cadenas que coinciden con el patrón completo y se genera para patrones globales y patrones de expresiones regulares.

Hay un ejemplo ilustrativo en la página de manual.

1

¡Parece que la explicación anterior no es precisa! Compruebe este ejemplo:

$ cat test.exp 
#!/usr/bin/expect 

set timeout 5 
log_user 0 

spawn bash 

send "ls -1 db*\r" 
expect { 
    -re "^db.*$" { 
    set bkpfile $expect_out(0,string) 
    } 
} 

send_user "The filename is: $bkpfile\n" 

close 
$ ls -1 db* 
dbupgrade.log 
$ ./test.exp 
can't read "bkpfile": no such variable 
    while executing 
"send_user "The filename is: $bkpfile\n"" 
    (file "./test.exp" line 15) 
$ 

El resultado de la prueba es el mismo cuando se usa $ expect_out (1, cadena) o $ expect_out (buffer). ¿Me estoy perdiendo algo o este es el comportamiento esperado?

0

Aleksandar - debería funcionar si cambia la coincidencia a "\ ndb. * $".

Si enciende exp_internal 1, verá el búfer contiene algo como esto: "ls -1 dB * \ r \ ndbupgrade.log \ r \ n08: 46: 09"

Así, el símbolo de intercalación (^) tirará su coincidencia de patrón.