La expresión regular del script bash de macOS no funciona como se esperaba

La expresión regular del script bash de macOS no funciona como se esperaba

Llevo más de 10 años fuera de la programación. Tengo un archivo de texto en el que estoy intentando leer el valor de Mpbs para la velocidad de carga y descarga.

     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%

He estado usando una herramienta de expresiones regulares para probar y crear mi expresión regular, que ofrece el resultado que quiero.

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

Estoy seguro de que debe haber una mejor manera de lograr lo que quiero, pero el principal problema que tengo es que la expresión regular no funciona.

Respuesta1

Tienes tres problemas en tu código.

  1. No estás usando las expresiones regulares que crees que estás (faltan $en regex2y regex3).
  2. bashno entiende la expresión regular tipo Perl \Wcomo "no es un carácter de palabra".
  3. No estás leyendo líneas (aunque tu variable se llame line).

Para resolver esto:

  1. Utilice $on para obtener los valores de regex2y regex3en las pruebas:

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. Utilice la expresión regular POSIX [^[:alnum:]_]en lugar de \Wen las expresiones, o [[:blank:]]que coincida con una tabulación o un espacio.

  3. Uso while IFS= read -r line; do ...; done(ver "Entendiendo "IFS= leer -r línea"").

información relacionada