2012-06-15 12 views
6

Se voglio abbinare DEF_23 utilizzando la seguente espressione regolare:

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

perché si dice tale elemento non in ordine? come funziona questo $ expect_out? e se voglio assegnare il risultato come DEF, come ottenere il DEF usando regexp e assegnarlo al risultato della variabile?

+1

Intendevi avere bretelle aggiuntive attorno alla linea 'set'? Altrimenti è un uso molto strano dell'aspettativa, anzi ... –

risposta

9

Si sta cercando expect_out(0,string) - l'elemento dell'array 1,string verrà popolato se si fossero catturate parentesi nell'espressione regolare.

Il expect manpage documenta l'uso di expect_out nella documentazione del aspettano comando:

momento che corrispondono a un modello (o EOF o full_buffer), qualsiasi corrispondenza e di uscita in precedenza senza pari viene salvato nella variabile expect_out (buffer). Fino a 9 corrispondenze di sottostringhe regexp vengono salvate nelle variabili expect_out (1, stringa) tramite expect_out (9, stringa). Se viene utilizzato il -indices bandiera, prima di un modello, l'avviamento e gli indici terminano (in una forma adatta per lrange) delle 10 stringhe sono memorizzati nelle variabili expect_out (X, inizia) e expect_out (X , fine) dove X è una cifra, corrisponde alla posizione della sottostringa nel buffer. 0 fa riferimento a stringhe che corrispondono al modello intero e vengono generate per motivi glob e modelli regexp.

C'è un esempio illustrativo nella manpage.

1

Sembra che la spiegazione di cui sopra non sia precisa! Vedi questo esempio:

$ 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) 
$ 

Il risultato del test è lo stesso quando viene utilizzato $ expect_out (1, stringa) o $ expect_out (buffer). Mi manca qualcosa o questo è il comportamento previsto?

0

Aleksandar: dovrebbe funzionare se si modifica la corrispondenza in "\ ndb. * $".

Se si accende exp_internal 1, si vedrà il buffer contiene qualcosa di simile: "ls -1 db * \ r \ ndbupgrade.log \ r \ n08: 46: 09"

Così, l'accento circonflesso (^) lancerà la tua corrispondenza del modello.