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. 자신이 생각하는 정규식을 사용하고 있지 않습니다( 및 $에서 누락됨 ).regex2regex3
  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= 읽기 -r 라인" 이해").

관련 정보