존재하다리눅스 명령줄William Shots는 문자 범위에 문제가 있을 수 있다고 주장합니다. 아래 관련 발췌문을 참조하세요.요점은 내꺼야.
문자 범위
다른 Unix 계열 환경에서 왔거나 해당 주제에 대한 다른 책을 읽었다면
[A-Z]
및[a-z]
문자 범위 기호를 접했을 수 있습니다. 이는 전통적인 Unix 표기법이며 이전 버전의 Linux에서도 작동합니다.여전히 작동할 수 있지만 올바르게 구성하지 않으면 예상한 결과가 생성되지 않으므로 주의해서 사용해야 합니다. 지금은 이를 피하고 문자 클래스를 사용해야 합니다..
그의 마지막 말은 무엇이었나요? POSIX 표준은 이에 대해 무엇을 말합니까?
답변1
이는 대문자와 소문자를 먼저 사용한 다음 다른 문자를 사용하는 것이 아니라 교대로 사용하는 로케일을 의미할 가능성이 높습니다.
$ echo "$LANG"
en_US.UTF-8
$ touch a A z Z
$ ls
A Z a z
$ bash -c 'echo [a-z]'
a A z
그러나 적절한 문자 클래스가 작동할 수 있습니다.
$ bash -c 'echo [[:lower:]]'
a z
a
그러나 다음보다 더 많은 것을 일치시키는 것도 가능합니다 z
:
$ LANG=fi_FI.UTF-8
$ touch ä Ä ö Ö
$ bash -c 'echo [[:lower:]]'
a z ä ö
이를 방지하고 영어 소문자만 a
일치시키려는 경우 z
Bash에는 범위를 ASCII 순서로 해석하는 옵션이 있습니다.
$ bash -c 'shopt -s globasciiranges; echo [a-z]'
a z
언제든지 기본 대조 순서를 강제할 수 있습니다.
$ LC_COLLATE=C bash -c 'echo [a-z]'
a z
POSIX가 말하는 바에 따르면 대괄호 표현식의 범위는 기본 POSIX 로케일이 아닌 로케일에서 정의되지 않은 것 같습니다. 패턴 일치 설명은 다음을 참조합니다.대괄호 표현식의 정규 표현식 설명, 내용은 다음과 같습니다.
POSIX 로케일에서 범위 표현식은 조합 시퀀스의 두 요소를 포함하는 두 요소 사이의 조합된 요소 세트를 나타냅니다. 다른 로케일에서는 범위 표현식에 지정되지 않은 동작이 있습니다. 즉, 엄격하게 호환되는 애플리케이션은 범위 표현식이 유효한지 여부나 일치하는 조합 요소 집합에 의존해서는 안 됩니다.