Регулярное выражение скрипта 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

В вашем коде три проблемы.

  1. Вы не используете те регулярные выражения, которые, как вам кажется, используете (отсутствуют $и regex2) regex3.
  2. bashне понимает регулярное выражение в стиле Perl \Wкак «несловный символ».
  3. Вы не читаете строки (даже если ваша переменная называется line).

Чтобы решить эту проблему:

  1. Используйте $on для получения значений regex2и regex3в тестах:

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. Используйте регулярное выражение POSIX [^[:alnum:]_]вместо \Wв выражениях или , [[:blank:]]которое соответствует табуляции или пробелу.

  3. Используйте while IFS= read -r line; do ...; done(см. "Понимание «IFS= read -r line»").

Связанный контент