2012-06-15 35 views
6

Nếu tôi muốn để phù hợp với DEF_23 sử dụng regexp sau:

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

lý do tại sao nó nói không có yếu tố như vậy trong mảng? $ expect_out này hoạt động như thế nào? và nếu tôi muốn gán kết quả là DEF, làm thế nào để có được DEF bằng cách sử dụng regexp và gán cho kết quả biến?

+1

Ý của bạn là có thêm dấu ngoặc ôm quanh dòng 'set'? Nếu không, đó là một cách sử dụng rất kỳ lạ của 'kỳ vọng' thực sự… –

Trả lời

9

Bạn đang tìm kiếm expect_out(0,string) - phần tử mảng 1,string sẽ được điền nếu bạn đã chụp dấu ngoặc đơn trong biểu thức chính quy của mình.

Các expect manpage tài liệu sử dụng expect_out trong tài liệu của mong đợi lệnh:

Khi phù hợp với một mô hình (hoặc eof hoặc full_buffer), bất kỳ phù hợp và đầu ra trước đây chưa từng được lưu trong biến số expect_out (bộ đệm). Tối đa 9 kết quả chuỗi con regexp được lưu trong các biến expect_out (1, chuỗi) qua expect_out (9, chuỗi). Nếu cờ -indices được sử dụng trước mẫu, chỉ số bắt đầu và kết thúc (trong biểu mẫu thích hợp cho lrange) trong số 10 chuỗi được lưu trữ trong các biến expect_out (X, bắt đầu) expect_out (X , end) trong đó X là một chữ số, tương ứng với vị trí chuỗi con trong bộ đệm. 0 đề cập đến các chuỗi phù hợp với toàn bộ mẫu và được tạo cho các mẫu glob cũng như các mẫu regexp.

Có một ví dụ minh họa trong manpage.

1

Dường như việc giải thích ở trên không chính xác! Kiểm tra ví dụ này:

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

Kết quả thử nghiệm là như nhau khi $ expect_out (1, string) hoặc $ expect_out (đệm) được sử dụng. Tôi có thiếu điều gì đó hoặc đây là hành vi mong đợi không?

0

Aleksandar - nó sẽ hoạt động nếu bạn thay đổi đối sánh thành "\ ndb. * $".

Nếu bạn bật exp_internal 1, bạn sẽ thấy bộ đệm chứa một cái gì đó như thế này: "ls -1 db * \ r \ ndbupgrade.log \ r \ n08: 46: 09"

Vì vậy, caret (^) sẽ ném mô hình của bạn phù hợp.

Các vấn đề liên quan