정수, 소수, 부동 소수점 정규식

개요



쉘을 사용해 수치 데이터 파일의 정형을 실시하고 있을 때, 정규 표현으로 막혔으므로 메모 대신에.
정수(1,2,3,...)와 소수(1.1,2.5,...)와 부동 소수점수(1.0E+10, 1.6e-19, ...)가 섞인 파일로부터 수치를 빼내는 정규 표현.

정규식



다음과 같은 정규 표현식으로 추출 할 수 있습니다.[+-]?[0-9]+[\.]?[0-9]*[eE]?[+-]?[0-9]*실제로는 이것을 grep 나름대로.

2016/8/30 추가
@히코자루_3씨보다, 위의 정규 표현이라고 egrep1+1 와 같은 케이스도 매치해 버린다는 지적이 있었습니다.
다음 정규 표현식이 바람직합니다.5-2
또한 이와 함께 테스트용 스크립트를 수정했기 때문에 지금까지 기재하고 있던 섹션 아래에 수정 후의 것을 추기합니다.

2017/6/22 추가
@scivola씨로부터, [+-]?[0-9]+[.]?[0-9]([eE][+-])?[0-9]와 같은 「지수 돌아가기」도 매치해 버린다고 하는 지적이 있었습니다.
위의 것보다 아래의 것이 더 바람직할 것입니다.1e+
이 정규 표현식의 테스트 결과이지만, 현재 바쁜 경우 할애 (또는 나중에 다시 추가)하겠습니다 ...

2018/12/2 추가[+-]?[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)? 와 같은 소수점 이하만으로 수치를 표현하고 있는 경우는.123되는 것 같습니다.
@ 나베타 감사합니다! !
테스트 결과도 편집했습니다. 지금 다시 보면 조금 기분 나쁜 결과도 있네요.

예 (정규 표현식에 실수 있음)



테스트 용 스크립트. [+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?egrep 선택적으로 조건과 일치하는 부분 만 출력합니다.

testscript
#!/bin/bash
file=$1

for line in `cat ${file}`
do
    echo ${line}
    N=`echo ${line} | egrep -o '[+-]?[0-9]+[\.]?[0-9]*[eE]?[+-]?[0-9]*'`
    echo "result = ${N}"
done

그래서 이것에 이런 느낌의 테스트 케이스를 던져

testcase
1
58
-5
2.8
-3.39
73.098abh
1.0e+29
1.6E-16
abc39
num=395479.27

에서 실행 결과

결과
>./numtest.sh testfile.txt
1
result = 1
58
result = 58
-5
result = -5
2.8
result = 2.8
-3.39
result = -3.39
73.098abh
result = 73.098
1.0e+29
result = 1.0e+29
1.6E-16
result = 1.6E-16
abc39
result = 39
num=395479.27
result = 395479.27

제대로 수치만 빼낼 수 있다고 생각해

예 (2018/12/2 수정 버전)



그래서 수정 한 쉘 스크립트입니다.

testscript
#!/bin/bash
file=$1

for line in `cat ${file}`
do
    echo ${line}
    N=`echo ${line} | egrep -o '[+-]?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE][+-]?[0-9]+)?'`
    for res in $N
    do 
        echo "result = ${res}"
    done
done

이와 함께 테스트 케이스도 늘렸습니다. 이번에는 한 줄에 여러 숫자가있는 경우에도 대응할 수 있도록하고 있습니다.

testcase
1
58
-5
2.8
-3.39
73.098abh
1.0e+29
1.6E-16
abc39
num=395479.27
1+1
234gh290
432-84
235hk23.4e-6
1e+
3e-
.123
.23h5
hoge

이하, 결과.

결과
1
result = 1
58
result = 58
-5
result = -5
2.8
result = 2.8
-3.39
result = -3.39
73.098abh
result = 73.098
1.0e+29
result = 1.0e+29
1.6E-16
result = 1.6E-16
abc39
result = 39
num=395479.27
result = 395479.27
1+1
result = 1
result = +1
234gh290
result = 234
result = 290
432-84
result = 432
result = -84
235hk23.4e-6
result = 235
result = 23.4e-6
1e+
result = 1
3e-
result = 3
.123
result = .123
.23h5
result = .23
result = 5
hoge

지금 다시 결과를 확인하면, -o 같은 경우에서 .23h5.23 . .

좋은 웹페이지 즐겨찾기