다음과 같은 정규식이 있고 이를 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
BRE
or 을 사용하여 bash 스크립트를 사용하고 있습니다 ERE
.
답변1
정규 표현식을 쉘 glob으로 변환하려는 경우 모든 정규 표현식 연산자를 쉘 glob 연산자로 변환할 수 있는 것은 아닙니다. 예를 들어, regexp 와 동등한 표준 glob은 없습니다 *
.
그러나 일부 쉘은 이 목적을 위해 전역 연산자를 확장합니다. 에서는 이 옵션 zsh
이 활성화된 경우에만 이 문제가 발생합니다 #
. extendedglob
ksh에서는 x*
. , 이 옵션이 활성화되면 ksh 확장 연산자의 하위 집합인,, 및만 지원됩니다(역참조는 제외,,,,...).*(x)
bash
extglob
@(...)
?(...)
*(...)
+(...)
~(...)
\d
\s
{1,3}(...)
ksh93에는 printf
형식 지시문을 사용하여 확장 정규식을 ksh glob으로 변환할 수 있는 내장 함수가 있습니다 %P
( %R
ksh 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
일치 합니다 .-
+
019
bash
또한 연산자를 사용하여 확장된 정규식 패턴 일치를 수행 bash
할 수도 있고 [[ $string =~ $regexp ]]
, 물론 , 와 같은 정규식 일치를 수행할 수 있는 도구 grep
나 perl
또는 awk
같은 고급 sed
셸을 호출할 수도 있습니다 . 결국 이것이 셸 목적입니다. : 명령.zsh
ksh93