Я не занимался программированием более 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

Я уверен, что должен быть лучший способ добиться того, чего я хочу, но главная проблема, с которой я сталкиваюсь, заключается в том, что регулярное выражение не работает.

0
Kusalananda 9 Апр 2020 в 16:41
3
Вы пытаетесь сопоставить литералы regex2 и regex3, я думаю, вам нужны $regex2 и $regex3.
 – 
jesse_b
8 Апр 2020 в 16:02
Упс.. Большое спасибо. Это был плохой вырез и вставка. теперь проблема в том, что \W+ не работает. Если я просто оставлю правильное количество пробелов (в данном случае четыре) в переменной regex2, оно совпадет. это \W или \s не правильный путь? я пробовал использовать \ \\ \\\ и \\\\
 – 
Stewart Rolfe
8 Апр 2020 в 16:13
\W — это функция PCRE. bash заявляет только о поддержке ERE. Я подозреваю, что (особенно в MacOS) версия bash не распознает \W (или рассматривает его как буквальный W). Вместо этого вы можете использовать [[:blank:]] для сопоставления горизонтальных пробелов (если вы специально не ожидаете других символов, отличных от слова, между : и числом)
 – 
steeldriver
8 Апр 2020 в 16:27
PCRE \W совпадает с POSIX [^[:alnum:]_].
 – 
Kusalananda
8 Апр 2020 в 18:09

1 ответ

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

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

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

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

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

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

0
Kusalananda 8 Апр 2020 в 18:25
Спасибо, один и все.
 – 
Stewart Rolfe
9 Апр 2020 в 16:22
Вы можете просмотреть unix.stackexchange.com/help/someone-answers, а также пройти экскурсию: unix.stackexchange.com/tour (после этого вы получите значок).
 – 
Kusalananda
9 Апр 2020 в 16:29