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.
- No estás usando las expresiones regulares que crees que estás (faltan
$
enregex2
yregex3
). bash
no entiende la expresión regular tipo Perl\W
como "no es un carácter de palabra".- No estás leyendo líneas (aunque tu variable se llame
line
).
Para resolver esto:
Utilice
$
on para obtener los valores deregex2
yregex3
en las pruebas:if [[ $line =~ $regex2 ]]; then ...; fi
Utilice la expresión regular POSIX
[^[:alnum:]_]
en lugar de\W
en las expresiones, o[[:blank:]]
que coincida con una tabulación o un espacio.Uso
while IFS= read -r line; do ...; done
(ver "Entendiendo "IFS= leer -r línea"").