일부 텍스트에서 숫자를 추출하려고 합니다. 현재 나는 다음을 사용하고 있습니다 :
echo "2.5 test. test -50.8" | tr '\n' ' ' | sed -e 's/[^0-9.]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' '
그러면 2.5, "." 및 50.8이 표시됩니다. sed
양수든 음수든 부동 소수점 숫자를 감지하도록 첫 번째 것을 어떻게 수정해야 합니까 ?
답변1
grep
이에 적합합니다.
$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?'
2.5
-50.8
어떻게 작동하나요?
-E
확장 정규식을 사용하세요.
-o
컨텍스트가 아닌 일치하는 항목만 반환합니다.
[+-]?[0-9]+([.][0-9]+)?+
일치하는 숫자는 다음과 같이 식별됩니다.
[+-]?
선택적 부팅 플래그
[0-9]+
하나 이상의 숫자
([.][0-9]+)?
선택적 마침표 뒤에 하나 이상의 숫자가 옵니다.
한 줄에 출력 받기
$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' | tr '\n' ' '; echo ""
2.5 -50.8
답변2
일방 grep
통행:
$ echo "2.5 test. test -50.8" | tr ' ' '\n' | grep -E '^[+-]?[0-9]*\.?([0-9]+)$'
2.5
-50.8
tr
공백을 개행 문자로 바꾸어 해당 줄을 여러 줄로 변환 하면 됩니다 .이 명령은
grep
선택적 또는로 시작 하고 그 뒤에 일부 숫자와 선택적 소수점이 올 수 있는+
문자열을 찾습니다.-
그런 다음 끝에 숫자를 추가해야 합니다.
00000123.91288000
이렇게 하면 이상하게 보이는 것과 같은 것이 통과할 수 있습니다 . 이것이 필터링하려는 숫자입니까? 기술적으로는 이상한 형식의 부동 소수점 숫자입니다.
편집하다: 도착하다적절하게숫자 확인, 실행아니요자신만의 정규 표현식을 작성해보세요! 신뢰할 수 있는 곳에서 라이브러리 루틴을 사용하세요.
Scalar::Util
내 경우에는 편리한 서브루틴이 있는 Perl 패키지를 사용하겠습니다 looks_like_number()
.
$ echo "2.5 test. test -50.8" | tr ' ' '\n' | perl -MScalar::Util -ne 'Scalar::Util::looks_like_number($_) && print'
2.5
-50.8
여기에는 다른 형식으로 숫자를 조회할 수 있다는 추가 이점이 있습니다 1e3
.