서로 다른 명명 규칙을 가진 2개의 호스트가 있다고 가정해 보겠습니다.
ab_01
그리고ab_cd
나는 그들의 명명 규칙이 특정 표준을 충족하는지 확인하고 싶습니다.
그래서 테스트하기 위해 간단한 스크립트를 작성했습니다.
wolf@linux:~$ host='ab_01'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] ]]; then echo True; else echo False; fi
False
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[0-9][0-9] ]]; then echo True; else echo False; fi
True
효과가있다!
다음 단계는 이 두 정규식을 셸의 OR 연산자와 결합하는 것입니다.||
if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
then
echo True
else
echo False
fi
테스트해보자
wolf@linux:~$ echo $host
ab_01
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
> echo True
> else
> echo False
> fi
True
wolf@linux:~$
그것은 ab_01
및 에서 작동합니다 ab_cd
.
그러나 호스트 이름에 더 많은 문자를 추가하면 False여야 하는데 여전히 True가 표시됩니다.
다음을 사용하여 host='ab_0123'
테스트 해 보겠습니다.host='ab_cdef'
wolf@linux:~$ host='ab_0123'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
> echo True
> else
> echo False
> fi
True
wolf@linux:~$
또 다른 테스트에서는 False 대신 True가 표시됩니다.
wolf@linux:~$ host='ab_cdef'
wolf@linux:~$ if [[ $host =~ [a-z][a-z]_[a-z][a-z] || $host =~ [a-z][a-z]_[0-9][0-9] ]];
> then
> echo True
> else
> echo False
> fi
True
wolf@linux:~$
이 코드에 어떤 문제가 있으며 어떻게 해결하나요?
답변1
패턴 일치와 달리 정규식 일치는 문자열의 시작/끝에 고정되지 않습니다.어딘가에문자열이면 충분합니다. ("일치"라기보다는 "검색"에 더 가깝고 일부 Python 함수 이름이 차이를 만든다고 생각합니다 ab_cdef
. ab_cd
)
^
및 다음을 사용하여 패턴을 명시적으로 고정해야 합니다 $
.
$ if [[ foobar =~ o ]]; then echo yes; else echo no; fi
yes
$ if [[ foobar =~ ^o$ ]]; then echo yes; else echo no; fi
no
||
정규식에 대체 항목을 넣을 수도 있습니다 .
re='^[a-z][a-z]_([0-9][0-9]|[a-z][a-z])$'
if [[ $host =~ $re ]]; then ...
(또는 더 편안한 정규 표현식이 허용됩니다 ab_a0
: ^[a-z][a-z]_[0-9a-z][0-9a-z]$
.)