Я не программирую уже более 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
В вашем коде три проблемы.
- Вы не используете те регулярные выражения, которые, как вам кажется, используете (отсутствуют
$
иregex2
)regex3
. bash
не понимает регулярное выражение в стиле Perl\W
как «несловный символ».- Вы не читаете строки (даже если ваша переменная называется
line
).
Чтобы решить эту проблему:
Используйте
$
on для получения значенийregex2
иregex3
в тестах:if [[ $line =~ $regex2 ]]; then ...; fi
Используйте регулярное выражение POSIX
[^[:alnum:]_]
вместо\W
в выражениях или ,[[:blank:]]
которое соответствует табуляции или пробелу.Используйте
while IFS= read -r line; do ...; done
(см. "Понимание «IFS= read -r line»").