대괄호 와일드카드의 대소문자 구분

대괄호 와일드카드의 대소문자 구분

일반적으로 bash 와일드카드는 대소문자를 구분합니다.

$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips

대괄호를 사용해도 변경되지 않는 것 같습니다.

$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips

하이픈을 사용해도 여전히 변경되지 않습니다.

$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips

그러나 편지는 흩어져 있습니다.

$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py

이는 하이픈이 "AaBbCcDd" 로케일 순서를 사용하고 있음을 나타냅니다. 그렇다면 대문자로 시작하는 모든 파일을 와일드카드로 지정할 수 있는 방법이 있습니까?

답변1

Bash 4.3 이상에는 다음과 같은 shopt 옵션이 있습니다 globasciiranges.

~에 따르면shopt 내장 GNU 매뉴얼 페이지:

globasciiranges
설정된 경우 패턴 일치 대괄호 식(패턴 일치 참조)에 사용되는 범위 식은 비교를 수행할 때 기존 C 로캘에서처럼 작동합니다. 즉, 현재 로케일의 조합 순서를 고려하지 않으므로 'A'와 'B' 사이에서 'b'는 대조되지 않지만 ASCII 대문자와 소문자는 함께 대조됩니다.

당신이 할 수 있다는 것이 밝혀졌습니다

$ shopt -s globasciiranges 
$ echo [A-Z]*

비활성화 합니다 shopt -u.

또 다른 방법은 로케일을 C로 변경하는 것입니다. 서브셸을 사용하여 임시로 이 작업을 수행할 수 있습니다.

$ ( LC_ALL=C ; printf '%s\n' [A-Z]*; )

원하는 결과를 얻을 수 있으며, 서브쉘이 완료되면 메인 쉘의 로케일은 이전과 동일하게 유지됩니다.

또 다른 옵션은 bash shopt 옵션과 함께 중괄호 확장을 사용하지 않는 것입니다 [A-Z].{A..Z}nullglob

이 옵션을 활성화하면 nullglob경로 이름 확장 중에 패턴이 일치하지 않는 경우 패턴 자체 대신 빈 문자열이 반환됩니다.
결과적으로 예상대로 작동합니다.

$ shopt -s nullglob;printf '%s\n' {A..Z}*

답변2

다음과 같이 모두 대문자를 쓸 수 있습니다.

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*

또는 명명된 문자 클래스를 사용하여 [:upper:]현재의 모든 대문자를 나타낼 수 있습니다 locale.

[[:upper:]]*

알다시피, 범위(예: [B-C]동일한 알파벳 문자의 대문자 및 소문자)를 사용하면 서로 나란히 정렬됩니다( 의 조합 규칙에 따라 locale).

답변3

문자 범위에 "직관적이지 않은" 문자(예: 대문자로 묶인 범위의 소문자)를 포함하는 것은 LC_COLLATE로케일 설정 때문입니다. LC_COLLATE는 정렬 순서를 나타내야 하지만 제대로 작동하지 않으며(문자열 정렬은 로캘에서 수행할 수 있는 것보다 더 복잡함) 이를 사용하지 않는 것이 더 나을 것입니다. LC_COLLATE귀하의 로케일에서 제거하는 것이 좋습니다 . LANG, 또는 을 설정하려면 LANGUAGE이렇게 하지 말고 필요한 것만 설정하세요: LC_CTYPE, LC_MESSAGES, LC_TIME.

로캘 설정에 대한 자세한 배경 정보는 다음을 참조하세요.로케일을 무엇으로 설정해야 하나요? 이것이 어떤 영향을 미칠까요?그리고LC_*를 설정하지만 LC_ALL은 설정하지 않음

사용자의 설정에 관계없이 스크립트에서 신뢰할 수 있는 결과를 얻으려면 를 설정하십시오 LC_ALL=C.

답변4

echo [cC]*는 [A-Za-z]*와 같이 원하는 작업을 수행해야 합니다.

내 시스템의 와일드카드가중지됨대소문자를 구분하므로 많은 스크립트가 더 이상 제대로 작동하지 않습니다. :-(

관련 정보