나는 겉보기에 간단해 보이는 일을 하기 위해 며칠 동안 애썼다.
(LC_ALL=POSIX; regex="src\\.[\\x20-\\x7E]+\\.system"; file="src.dirtree.system";
if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
우리가 원하는 것은 src.*.system과 일치하는 것입니다. 여기서 *는 문자 범위 내의 모든 것이 될 수 있습니다 \x21-\x7E
. 내가 원한다면 작동할 수 \x20-\x7E
있지만 [ -~]+
이 범위를 작동시키거나 중복된 임의의 16진수 이스케이프 범위를 작동시키려면 어떻게 해야 합니까 *, + or {x,y}
?
Bash 버전은 입니다 4.3.11(1)-release
. 아니요, 변경할 수 없습니다.
답변1
man 3 regex
자세한 내용은 Bash 문서를 참조하세요.
" " 및 " "
=~
와 우선순위가 동일한 추가 이항 연산자 " "를 사용할 수도 있습니다 . 사용되면 연산자 오른쪽에 있는 문자열은 확장 정규식으로 처리되어 그에 따라 일치됩니다(예:==
!=
정규식삼)).
man 3 regex
다음 설명에서 확인된 것처럼 Linux에서 이것이 POSIX 정규 표현식임을 나타냅니다.구성 플래그이 기능을 활성화해야 합니다:
--enable-cond-regexp
=~
POSIX 정규식과 일치하도록 조건부 명령에 "" 이진 연산자 사용을 지원합니다[[
. (바라보다 조건부 구조).
다음 과 man 7 regex
같이 구문을 설명합니다.
이러한 문자와 "["(다음 단락 참조)을 사용하는 특정 조합을 제외하고 다른 모든 특수 문자("\" 포함)는 대괄호 표현식에서 특별한 의미를 잃습니다.
그리고 16진수 바이트 범위에 대한 언급은 없습니다. 그래서 나는 그것이 직접적으로 가능하지 않다고 말하고 싶습니다.
당신은 남용할 수 있습니다ANSI C 참조 함수실제 바이트를 16진수 버전으로 바꿉니다.
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file='src.dir!ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file='src.dir ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
no
$ (LC_ALL=POSIX; regex="src\.["$'\x21-\x7E'"]+\.system"; file="src.dirtree.system"; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
, (해당 바이트로 확장됨) 및 regex
3개의 문자열이 어떻게 연결되는지 확인하세요 ."src\."
$'\x21-\x7E'
"]+\.system"
물론 이 경우에는 !-~
적절하게 인용된 내용을 사용할 수 있습니다.
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dirtree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dir!ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
yes
$ (LC_ALL=POSIX; regex='src\.[!-~]+\.system'; file='src.dir ree.system'; if [[ $file =~ $regex ]]; then echo "yes"; else echo "no"; fi;)
no
아니면 [[:graph:]]
ASCII 문자와 같은 범위여야 한다고 생각합니다.