macOS bash 스크립트 정규 표현식이 예상대로 작동하지 않습니다.

macOS bash 스크립트 정규 표현식이 예상대로 작동하지 않습니다.

나는 10년 넘게 프로그래밍을 하지 않았습니다. 텍스트 파일이 있는데 업로드 및 다운로드 속도에 대한 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. 생각대로 정규식을 사용하고 있지 않습니다 ( $및 누락 regex2) regex3.
  2. bashPerl과 같은 정규 표현식은 \W"단어 문자가 아님"을 의미하는 것으로 이해되지 않습니다.
  3. 변수가 호출되었음에도 불구하고 행을 읽지 않습니다 line.

이 문제를 해결하려면:

  1. $테스트에서 합계 값을 얻으려면 on을 사용하십시오 .regex2regex3

    if [[ $line =~ $regex2 ]]; then ...; fi
    
  2. 표현식 [^[:alnum:]_]대신 POSIX 정규 표현식을 사용 하거나 탭이나 공백을 일치시키세요.\W[[:blank:]]

  3. 사용 while IFS= read -r line; do ...; done('"IFS=read-r-line" 이해").

관련 정보