쉘에서 이상한 동작이 발생합니다.
정규식의 "_"를 16진수 코드와 일치시키려고 하면 작동하지만 "("에서는 작동하지 않습니다.
$ regex1=$'\x5f'
$ pattern1='_'
$ if [[ $pattern1 =~ $regex1 ]]; then echo yes; else echo no; fi
yes
$ regex2=$'\x28'
$ pattern2='('
$ if [[ $pattern2 =~ $regex2 ]]; then echo yes; else echo no; fi
no
이 행동을 설명할 수 있나요?
답변1
regex2=$'\x28'
정확히 동일합니다 regex2='('
. 쉘은 $'...'
값을 할당할 때 따옴표를 처리합니다. (
그 자체로는 유효하지 않은 정규식이므로 다음 [[ =~ ]]
종료 상태를 반환하여 오류가 보고됩니다 2
.
$ re='('; [[ "(" =~ $re ]]; echo "$?"
2
(물론 if
명령문 내에서는 1
"일치하지 않는" 종료 코드와 "오류" 종료 코드 2
의 차이를 구분할 수 없지만 차이는 있습니다.)
정규 표현식에서 여는 괄호를 이스케이프 처리해야 합니다.
$ re='\('; [[ "(" =~ $re ]] && echo match
match
또는 괄호 그룹에 넣으세요.
$ re='[(]'; [[ "(" =~ $re ]] && echo match
match
빠른 테스트 후에 Bash의 정규식은 16진수 또는 8진수 문자 이스케이프를 지원하지 않으므로 re='\050'
작동 re='\x28'
하지 않습니다.