我已经十多年没有编程了。我有一个文本文件,我正在尝试读取上传和下载速度的 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=读取-r行””)。