![macOS bash 스크립트 정규 표현식이 예상대로 작동하지 않습니다.](https://rvso.com/image/170658/macOS%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%A0%95%EA%B7%9C%20%ED%91%9C%ED%98%84%EC%8B%9D%EC%9D%B4%20%EC%98%88%EC%83%81%EB%8C%80%EB%A1%9C%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
저는 프로그래밍을 안 한 지 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
코드에 세 가지 문제가 있습니다.
- 자신이 생각하는 정규식을 사용하고 있지 않습니다( 및
$
에서 누락됨 ).regex2
regex3
bash
Perl과 같은 정규 표현식을\W
"단어 문자가 아닌" 것으로 이해하지 못합니다.- 변수가 호출되었음에도 불구하고 행을 읽지 않습니다
line
.
이 문제를 해결하려면:
테스트에서 및
$
값을 얻으려면 on을 사용하십시오 .regex2
regex3
if [[ $line =~ $regex2 ]]; then ...; fi
표현식
[^[:alnum:]_]
대신 또는 탭이나 공백과 일치하는 POSIX 정규 표현식을 사용하십시오 .\W
[[:blank:]]
사용
while IFS= read -r line; do ...; done
('"IFS= 읽기 -r 라인" 이해").