Der reguläre Ausdruck eines macOS-Bash-Skripts funktioniert nicht wie erwartet

Der reguläre Ausdruck eines macOS-Bash-Skripts funktioniert nicht wie erwartet

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.

  1. Sie verwenden nicht die regulären Ausdrücke, die Sie zu verwenden glauben ( $ein regex2und fehlen regex3).
  2. bashversteht den Perl-ähnlichen regulären Ausdruck nicht \Wals „kein Wortzeichen“.
  3. Sie lesen keine Zeilen (obwohl Ihre Variable aufgerufen wird line).

So lösen Sie das Problem:

  1. Verwenden Sie $on, um die Werte von regex2und regex3in den Tests zu erhalten:

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. 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:]]

  3. Verwenden Sie while IFS= read -r line; do ...; done(siehe "„IFS= read -r line“ verstehen").

verwandte Informationen