私は 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
コードには 3 つの問題があります。
- 想定している正規表現を使用していません (と
$
が抜けています)。regex2
regex3
bash
Perl のような正規表現\W
を「単語文字ではない」と認識しません。- 行を読み取っていません (変数が と呼ばれているにもかかわらず
line
)。
これを解決するには:
テスト内のと
$
の値を取得するには、 on を使用します。regex2
regex3
if [[ $line =~ $regex2 ]]; then ...; fi
表現内の
[^[:alnum:]_]
の代わりに、またはタブやスペースに一致するPOSIX 正規表現を使用します。\W
[[:blank:]]
使用
while IFS= read -r line; do ...; done
(「「IFS= read -r line」を理解する()。