2016-05-16 102 views
1

我剛開始學習期望scripting.I一直在試圖從我的輸出如下:使用以下command.can有人請告訴我,我在哪裏正則表達式想到

core.4046140998.01.10.133211 

與expect腳本出錯了?我想要將整個字符串(即核心.4046140998.01.10.133211 *)存儲在一個變量中並對其執行一些操作。

expect -re {^(core)\.*} {puts $expect_out(0,string)} 

我是否需要導入任何軟件包才能使這項工作?

+0

'^(core)\ .. *(\ *)$' – rock321987

+0

ok ...... expect_out(0,string)的輸出會有什麼結果? – john

+0

它應該包含整個字符串'core.4046140998.01.10.133211 *' – rock321987

回答

2

因爲這是期待,「芯」可以在一行的開頭出現,但不是在輸入字符串的開始。爲了證明:

$ expect 
expect1.1> spawn sh 
spawn sh 
8043 
expect1.2> send "echo core.1234\r" 
expect1.3> exp_internal 1 
expect1.4> expect -re {^core.*} 
Gate keeper glob pattern for '^core.*' is 'core*'. Activating booster. 

expect: does "" (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=no 
sh-4.3$ echo core.1234 
core.1234 
sh-4.3$ 
expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=yes re=no 
expect: timed out 
expect1.5> expect -re {(?n)^core.*} 
Gate keeper glob pattern for '(?n)^core.*' is 'core*'. Activating booster. 

expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "(?n)^core.*"? Gate "core*"? gate=yes re=yes 
expect: set expect_out(0,string) "core.1234\r" 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) "sh-4.3$ echo core.1234\r\ncore.1234\r" 
expect1.6> puts ">>>$expect_out(0,string)<<<" 
<<<core.1234 

注意事項:

  • 期待-re {^core.*}不匹配。我們看到「超時」消息
  • 注意,我們試圖匹配的內容:

    expect: does "sh-4.3$ echo core.1234\r\ncore.1234\r\nsh-4.3$ " (spawn_id exp6) match regular expression "^core.*"? Gate "core*"? gate=yes re=no 
    # ............^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    

    它從我發出的命令,所以用「正常」的主播將無法正常工作

  • 我期望的下一件事是-re {(?n)^core.*}。這確實與匹配。

    • (?n)是一個很少使用的Tcl regex指令,它告訴我們要「行敏感」匹配的正則表達式引擎。
    • 行敏感匹配意味着.將不匹配換行符和(更多與此有關),其^可以立即換行後一個多行字符串(同樣爲$
  • 注意輸出內匹配我的puts命令看起來很奇怪。這是由於$expect_out(0,string)結束時的回車。意識到這一點,並使用string trim要求

這裏的外賣教訓是:

  • 提取命令的輸出可以是很難預料,因爲提示和發送的命令可以得到方式。
  • 使用expect調試來了解爲什麼你的模式不匹配。
+0

嘿glenn ..感謝alot..it工作 – john

1

你已經錯過了.\.

^(core)\..*(\*)$ 

\.匹配的文字..匹配任何單個字符。

或者你也可以使用非貪婪版本:

^(core)\.[^*]*(\*)$ 
+0

嘗試它現在,但它不返回任何輸出... – john

+0

@john檢查我的編輯.. – heemayl