저는 프로그래밍을 안 한 지 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 라인" 이해").