A expressão regular do script bash do macOS não funciona conforme o esperado

A expressão regular do script bash do macOS não funciona conforme o esperado

Estou fora da programação há mais de 10 anos. Eu tenho um arquivo de texto que estou tentando ler o valor de Mpbs para velocidade de upload e download.

     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%

Tenho usado uma ferramenta regex para testar e construir minha regex, que entrega o resultado que desejo.

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

Tenho certeza de que deve haver uma maneira melhor de conseguir o que desejo, mas o principal problema que estou tendo é que o regex não funciona.

Responder1

Você tem três problemas em seu código.

  1. Você não está usando as expressões regulares que pensa que está (faltando $e regex2) regex3.
  2. bashnão entende a expressão regular semelhante ao Perl \Wcomo "não é um caractere de palavra".
  3. Você não está lendo linhas (mesmo que sua variável seja chamada line).

Para resolver isso:

  1. Use $on para obter os valores de regex2e regex3nos testes:

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. Use a expressão regular POSIX [^[:alnum:]_]no lugar de \Wnas expressões ou [[:blank:]]que corresponda a uma tabulação ou espaço.

  3. Usar while IFS= read -r line; do ...; done(veja "Compreendendo "IFS = read -r line"").

informação relacionada