bash + 정규식을 통해 이름 확인

bash + 정규식을 통해 이름 확인

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"

관련 정보