정규식을 bash 패턴으로 변환

정규식을 bash 패턴으로 변환

다음과 같은 정규식이 있고 이를 bash 패턴으로 변환하고 싶습니다.

itg='^[-+]?[0-9]*$'
fxp='^[-+]?[0-9]*[.,]?[0-9]+$'
flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$'

숫자 값을 일치시키려고 합니다.

Integral Values 1 21 144 -17

Fixed point values 3.142 0.334 .345 -7.345 -0.34345

Floating point values 3.142E-2 43.234E+3 234.345e7

BREor 을 사용하여 bash 스크립트를 사용하고 있습니다 ERE.

답변1

정규 표현식을 쉘 glob으로 변환하려는 경우 모든 정규 표현식 연산자를 쉘 glob 연산자로 변환할 수 있는 것은 아닙니다. 예를 들어, regexp 와 동등한 표준 glob은 없습니다 *.

그러나 일부 쉘은 이 목적을 위해 전역 연산자를 확장합니다. 에서는 이 옵션 zsh이 활성화된 경우에만 이 문제가 발생합니다 #. extendedglobksh에서는 x*. , 이 옵션이 활성화되면 ksh 확장 연산자의 하위 집합인,, 및만 지원됩니다(역참조는 제외,,,,...).*(x)bashextglob@(...)?(...)*(...)+(...)~(...)\d\s{1,3}(...)

ksh93에는 printf형식 지시문을 사용하여 확장 정규식을 ksh glob으로 변환할 수 있는 내장 함수가 있습니다 %P( %Rksh glob에서 (ast-open 플레이버) 정규식으로 역 변환 수행).

운이 좋다면 다음에서 결과 glob을 사용할 수 있습니다 bash -O extglob.

$ itg='^[-+]?[0-9]*$'
$ fxp='^[-+]?[0-9]*[.,]?[0-9]+$'
$ flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$'
$ ksh -c 'printf "%P\n" "$@"' ksh "$itg" "$fxp" "$flp"
?([-+])*([0-9])
?([-+])*([0-9])?([.,])+([0-9])
?([-+])*([0-9])?([.,])+([0-9])?([eE]?([-+])+([0-9]))

여기 당신은 운이 좋다. 그것은 이다 bash -O extglob.

어쨌든 입력 유효성 검사에 사용하려면 0123456789의 10자 대신 bash (및 오늘날 가장 일반적인 로케일) [0-9]에서 일치하는 문자로 변경해야 합니다.[0123456789][0-9]

또한 정규식은 , 빈 문자열 및 산술 평가와 같은 숫자(잘못된 8진수) 와 itg일치 합니다 .-+019bash

또한 연산자를 사용하여 확장된 정규식 패턴 일치를 수행 bash할 수도 있고 [[ $string =~ $regexp ]], 물론 , 와 같은 정규식 일치를 수행할 수 있는 도구 grepperl또는 awk같은 고급 sed셸을 호출할 수도 있습니다 . 결국 이것이 셸 목적입니다. : 명령.zshksh93

관련 정보