macOS bash 脚本正则表达式未按预期工作

macOS bash 脚本正则表达式未按预期工作

我已经十多年没有编程了。我有一个文本文件,我正在尝试读取上传和下载速度的 Mpbs 值。

     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%

我一直在使用正则表达式工具来测试和构建我的正则表达式,它提供了我想要的结果。

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

我确信一定有更好的方法来实现我想要的,但我遇到的主要问题是正则表达式不起作用。

答案1

您的代码中存在三个问题。

  1. 您没有使用您认为的正则表达式(缺少$regex2regex3
  2. bash不将类似 Perl 的正则表达式理解\W为“不是单词字符”。
  3. 您没有读取行(即使您的变量被称为line)。

为了解决这个问题:

  1. 使用on 获取测试中和$的值:regex2regex3

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. 使用 POSIX 正则表达式[^[:alnum:]_]代替\W表达式中的 ,或者[[:blank:]]匹配制表符或空格。

  3. 使用while IFS= read -r line; do ...; done(参见“理解“IFS=读取-r行””)。

相关内容