Bash 정규 표현식의 "(" 16진수 코드

Bash 정규 표현식의 "(" 16진수 코드

쉘에서 이상한 동작이 발생합니다.

정규식의 "_"를 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'하지 않습니다.

관련 정보