我已經十多年沒有程式了。我有一個文字文件,我正在嘗試讀取上傳和下載速度的 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行””)。