문자열을 정규 표현식과 비교

문자열을 정규 표현식과 비교

나는 그들이 따르는지 확인하기 위해 호스트 이름을 확인하고 싶습니다 Bash Shell.

호스트 이름이 다음과 같다고 가정합니다.ab-cde-01

wolf@linux:~$ h='ab-cde-01'
wolf@linux:~$ echo $h
ab-cde-01
wolf@linux:~$ 

나는 if else 루프를 구축하는 것으로 시작했고 잘 작동했습니다.

wolf@linux:~$ if [ $h = 'ab-cde-01' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

그러나 정규식을 사용하여 숫자를 [0-9]로 바꾸려고 하면 잘못된 이름이 표시됩니다.

wolf@linux:~$ if [ $h = 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 

업데이트 1: =~ 연산자

=~제안된 대로 연산자를 사용하십시오...

wolf@linux:~$ if [ $h =~ 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
bash: [: =~: binary operator expected
ab-cde-01 is an INVALID name
wolf@linux:~$ 

업데이트 2: 이중 괄호

wolf@linux:~$ if [[ $h =~ 'ab-cde-0[0-9]' ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 
  1. 이 코드에 어떤 문제가 있나요?
  2. 어떻게 고치나요?
  3. 이것이 특정 기준에 따라 호스트 이름을 확인하는 정확하고 효율적인 방법입니까?

업데이트 3: 내 참조를 위한 실제 답변

wolf@linux:~$ if [[ $h =~ ab-cde-0[0-9] ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

교훈을 얻으세요

  1. 단일 괄호 대신 이중 괄호를 사용하세요.
  2. 정규식에는 따옴표가 없습니다.

답변1

마지막 시도가 가장 근접했지만 여전히 몇 가지 문제가 있습니다.

기본적으로 정규식을 인용했기 때문에 작동하지 않습니다. 다음과 같아야 합니다.

MATCH='ab-cde-0[0-9]'
if [[ "$h" =~ $MATCH ]];then

하지만 여전히 문제가 있습니다. 정규식을 고정하지 않았기 때문에(주어진 문자열의 중간에서 일치할 수 있음을 의미) 위의 내용이 여전히 h=foo-ab-cde07bar.

앵커링은 다음과 같이 수행됩니다.

MATCH='^ab-cde-0[0-9]$'
if [[ "$h" =~ $MATCH ]];then

하지만 이 제한된 예에서는 정규식을 사용할 필요조차 없으며 대신 전역 일치를 사용할 수 있습니다. 이는 귀하가 발표하는 내용에 적합합니다.

MATCH='ab-cde-0[0-9]'
if [[ "$h" = $MATCH ]];then

$h참고: 이 문자열은 좋은 습관이기 때문에 모든 예에서 인용했습니다.

편집: 이제 제안된 대로 매처를 변수로 정의합니다.이르카초

관련 정보