문자열에서 양수/음수 부동 소수점 숫자 추출

문자열에서 양수/음수 부동 소수점 숫자 추출

일부 텍스트에서 숫자를 추출하려고 합니다. 현재 나는 다음을 사용하고 있습니다 :

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.

관련 정보