Ich habe mehr als 10 Jahre lang nicht programmiert. Ich habe eine Textdatei, aus der ich versuche, den Mbit/s-Wert für die Upload- und Downloadgeschwindigkeit zu lesen.
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%
Ich habe zum Testen und Erstellen meines regulären Ausdrucks ein Regex-Tool verwendet, das das gewünschte Ergebnis liefert.
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
Ich bin sicher, dass es einen besseren Weg geben muss, um mein Ziel zu erreichen, aber mein Hauptproblem ist, dass der reguläre Ausdruck nicht funktioniert.
Antwort1
Ihr Code weist drei Probleme auf.
- Sie verwenden nicht die regulären Ausdrücke, die Sie zu verwenden glauben (
$
einregex2
und fehlenregex3
). bash
versteht den Perl-ähnlichen regulären Ausdruck nicht\W
als „kein Wortzeichen“.- Sie lesen keine Zeilen (obwohl Ihre Variable aufgerufen wird
line
).
So lösen Sie das Problem:
Verwenden Sie
$
on, um die Werte vonregex2
undregex3
in den Tests zu erhalten:if [[ $line =~ $regex2 ]]; then ...; fi
Verwenden Sie in den Ausdrücken
[^[:alnum:]_]
anstelle von den regulären POSIX-Ausdruck oder den Ausdruck, der einem Tabulator oder Leerzeichen entspricht.\W
[[:blank:]]
Verwenden Sie
while IFS= read -r line; do ...; done
(siehe "„IFS= read -r line“ verstehen").