valid
이름이 일 때 다음 정규식이 인쇄되는 이유는 무엇입니까 hdpworker01
?
name=hdpworker01
[[ $name =~ worker[[:digit:]] ]] && echo valid
내가 하려는 것은 valid
이름이 일치하는 경우에만 인쇄하는 것입니다 worker[0-999]
.
예상 결과의 예:
- 을 위한
name=worker01
:valid
- 대상
name=hdpworker01
: 출력 없음
답변1
기본적으로 정규식은 문자열의 시작이나 끝에 고정되지 않습니다. 이는 예를 들어 파일 이름 글로빙 패턴과 다릅니다. 이는 표현식이 주어진 문자열의 어느 위치에서나 일치할 수 있음을 의미합니다.
표현식을 문자열의 시작 부분에 고정하려면 다음을 사용하십시오.
^worker[[:digit:]]
문자열 끝에 추가로 고정하고 1~3자리 숫자를 허용하려면 다음을 사용하세요.
^worker[[:digit:]]{1,3}$
일치하고 싶지만 worker10
일치하지 않거나 worker01
( worker003
제로 패딩이 없는 숫자) 다음을 사용하십시오.
^worker([0-9]|[1-9][0-9]{1,2})$
답변2
양쪽에 정규식을 고정합니다.
^worker[[:digit:]]$
답변3
이름이 hdpworker01인 동안 아래 정규식 인쇄가 작동하는 이유는 무엇입니까?
왜? 정규 표현식이 아니기 때문에고정된, 즉 일치해야 하는 문자열의 시작(또는 끝)을 정의하지 않습니다. worker
일치하는 문자열의 일부가 이면 정규식은 일치합니다 worker
. 그것은 다른 많은 변형 hdpworkeranything
과도 일치할 것입니다. worker
다음으로 시작하는 문자열을 일치시키려면 worker
정규식에 include 를 사용하십시오 ^
. 예를 들면 다음과 같습니다.
^worker
Worker라는 단어 뒤에 최대 3자리 숫자를 일치시키려면 다음을 사용할 수 있습니다.
^worker[0-9]{0,3}$
그러나 괄호 안에 있는 숫자를 캡처하고 정규 표현식을 변수에 배치하는 것이 현명합니다(변수를 사용하는 것이 현재 모범 사례입니다).
re='^worker([0-9]{0,3})$'
이는 $
문자열이 해당 지점에서 끝나야 함을 의미합니다.
경쟁은 다음과 같습니다:
[[ $str =~ $re ]] && n=$((10#${BASH_REMATCH[1]}+0)) || n=-1
내가 하려는 것은 이름이 작업자[0-999]인 경우에만 인쇄하는 것입니다. 작동합니다.
이렇게 하면 n
숫자 범위를 확인할 수 있습니다.
(( 0 <= n && n <= 999 )) && echo "valid with n=$n"