Shell(Bash)에서 "문자 클래스"가 "문자 범위"보다 우선해야 하는 이유는 무엇입니까?

Shell(Bash)에서 "문자 클래스"가 "문자 범위"보다 우선해야 하는 이유는 무엇입니까?

리눅스 명령줄(책 - 페이지 47)은 다음과 같이 말합니다.

...올바르게 구성하지 않으면 예상한 결과가 생성되지 않으므로 [문자 범위]에 매우 주의해야 합니다. 지금은 이러한 문자 클래스를 사용하지 말고 문자 클래스를 사용해야 합니다.

그 외에는 책에서는 아무런 이유도 제시하지 않습니다.

질문 1:그렇다면 정확히 왜캐릭터 클래스(예:,, [:alnum:]등)이 우선합니다.[:alpha:][:digit:]문자 범위(예를 들어,,, [a-z]등)?[A-Z][0-9]

질문 2:[:alpha:], [a-z], 및[A-Z]다른 언어의 대문자와 소문자? 마찬가지로 [:digit:]다른 언어의 숫자도 포함되나요? 일치하는 경우.

(두 가지 질문이 있다는 것을 알고 있지만 이 경우 IMO와 거의 관련이 있습니다.)

답변1

bash맨페이지 에 따르면 LC_COLLATE환경 변수는 Hauke ​​Laging의 답변에서와 같이 문자 범위에 영향을 미칩니다.

LC_COLLATE 이 변수는 경로 이름 확장 결과를 정렬할 때 사용되는 데이터 정렬을 결정하고 범위 표현식, 동등 클래스, 경로 이름 확장 및 패턴 일치의 정렬 순서의 동작을 결정합니다.

반면에 LC_CTYPE캐릭터 카테고리에 영향을 미치는 것은 다음과 같습니다.

LC_CTYPE이 변수는 경로 이름 확장 및 패턴 일치의 문자 해석과 문자 클래스의 동작을 결정합니다.

그게 무슨 뜻이야?둘 다영어, 왼쪽에서 오른쪽, 라틴 문자, 아라비아 숫자의 맥락에서 생각한다면 이러한 상황은 문제가 될 수 있습니다.

만약 당신이 그것에 관심이 있거나 여러 로케일에 대한 스크립트를 작성하고 있다면, 파일을 일치시킬 때 로케일 변수가 무엇인지 확인하거나 완전히 일반적인 방식으로 수행하고 있는지 확인하는 것이 가장 좋습니다.

그러나 언어학을 공부하지 않으면 특정 상황을 예측하기가 어렵습니다.

그러나 라틴어 로케일 변경을 사용하는지는 모르겠습니다.주문하다문자이므로 [az]는 괜찮습니다. 거기합자와 발음 구별 부호를 다양한 방식으로 구성하는 라틴 알파벳의 확장입니다. 그러나 여기에 약간의 실험이 있습니다.

mkdir /tmp/test
cd /tmp/test
export LC_CTYPE=de_DE.UTF-8
export LC_COLLATE=de_DE.UTF-8
touch Grüßen
ls G* # This says ‘Grüßen’
ls *[a-z]en # This says nothing!
ls *[a-zß]en # This says ‘Grüßen’
ls Gr[a-z]*en # This says nothing!

이것은 흥미롭습니다. 적어도 독일어의 경우 ü와 같은 발음 구별 부호와 ß와 같은 합자는 라틴 문자로 축소되지 않습니다. (그거나 내가 로케일 변경을 망쳤거나!)

물론, 이 방법은 불리할 수도 있습니다. 문자로 시작하는 파일 이름을 찾으려면 이 문자 [a-z]*를 사용하여 "A"로 시작하는 파일에 적용하세요.

답변2

적어도 bash 4.2를 사용하는 OS X에서는 UTF-8 로케일이 ASCII 데이터 정렬을 사용하는 것처럼 보이지만 ISO 8859-1 로케일은 일부 경우에 사용하지 않습니다.

$ LC_ALL=en_US.UTF-8 tr A-C 1-9 <<< B
2
$ LC_ALL=en_US.ISO8859-1 tr A-C 1-9 <<< B
6
$ LC_ALL=en_US.UTF-8 grep [A-Z] <<< ä
$ LC_ALL=en_US.ISO8859-1 grep [A-Z] <<< ä
ä

일부 환경에서는 UTF-8 로케일도 다른 데이터 정렬을 사용합니다.

[:upper:] 및 [:lower:]에는 많은 로케일에서 ASCII가 아닌 문자도 포함되어 있습니다. ASCII 문자만 일치시키려면 다음과 같이 사용하십시오.

LC_ALL=C tr a-zA-Z n-za-mN-ZA-M

LC_COLLATE=C 또는 LANG=C는 LC_ALL이 다른 값으로 설정된 경우 아무런 효과가 없습니다.

답변3

"다른 언어", 즉. 로케일마다 정렬 순서가 다를 수 있습니다. 따라서 이론적으로 이것은 a-z다른 로케일과 다를 수 있습니다. 모든 것을 일치시키려면 범위가 어려워집니다. 첫 번째 문자는 무엇이며 마지막 문자는 무엇입니까?

openSUSE의 사람들은 사용자 이름/비밀번호를 확인할 때 이에 대해 매우 편집증적입니다. 그들은 다음과 같이 합니다.[abcdefghi...]

다른 언어/문자 집합의 숫자에 대해서는 생각해 본 적이 없습니다. 흥미로운 점.

관련 정보