macOS bash 腳本正規表示式未如預期運作

macOS bash 腳本正規表示式未如預期運作

我已經十多年沒有程式了。我有一個文字文件,我正在嘗試讀取上傳和下載速度的 Mpbs 值。

     Server: Iomart - Maidenhead (id = 3839)
        ISP: Plusnet
    Latency:     8.59 ms   (0.10 ms jitter)
   Download:    71.43 Mbps (data used: 52.8 MB)                               
     Upload:    18.39 Mbps (data used: 16.9 MB)                               
Packet Loss:     0.0%

我一直在使用正規表示式工具來測試和建立我的正規表示式,它提供了我想要的結果。

regex2="Upload:\W+([0-9]+\.[0-9]+)"
regex3="Download:\W+([0-9]+\.[0-9]+)"

while read line; do  
    if [[ $line =~ regex2 ]]
    then
        echo  "match ${BASH_REMATCH[1]}"
        UPS=${BASH_REMATCH[1]}
    fi  
    if [[ $line =~ regex3 ]]
    then
    echo  "match ${BASH_REMATCH[1]}"
        DNS=${BASH_REMATCH[1]}
    fi 
done < Result.txt

我確信一定有更好的方法來實現我想要的,但我遇到的主要問題是正規表示式不起作用。

答案1

您的程式碼中存在三個問題。

  1. 您沒有使用您認為的正規表示式(缺少$regex2regex3
  2. bash不將類似 Perl 的正規表示式理解\W為「不是單字字元」。
  3. 您沒有讀取行(即使您的變數被稱為line)。

為了解決這個問題:

  1. 使用on 取得測試中和$的值:regex2regex3

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. 使用 POSIX 正規表示式[^[:alnum:]_]代替\W表達式中的 ,或[[:blank:]]符合製表符或空格。

  3. 使用while IFS= read -r line; do ...; done(參見“理解“IFS=讀取-r行””)。

相關內容