macOS bash スクリプトの正規表現が期待どおりに動作しない

macOS bash スクリプトの正規表現が期待どおりに動作しない

私は 10 年以上プログラミングをしていません。アップロード速度とダウンロード速度の 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

コードには 3 つの問題があります。

  1. 想定している正規表現を使用していません (と$が抜けています)。regex2regex3
  2. bashPerl のような正規表現\Wを「単語文字ではない」と認識しません。
  3. 行を読み取っていません (変数が と呼ばれているにもかかわらずline)。

これを解決するには:

  1. テスト内のと$の値を取得するには、 on を使用します。regex2regex3

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. 表現内の[^[:alnum:]_]の代わりに、またはタブやスペースに一致するPOSIX 正規表現を使用します。\W[[:blank:]]

  3. 使用while IFS= read -r line; do ...; done(「「IFS= read -r line」を理解する()。

関連情報