대괄호 글 로빙의 케이스 감도


10

일반적으로 bash globbing은 대소 문자를 구분합니다.

$ 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"를 사용하고 있음을 나타냅니다. 대문자로 시작하는 모든 파일을 가져갈 수있는 방법이 있습니까?


3
또한 [AZ]는 'z'를 제외한 모든 소문자와 일치합니다.
PJTraill

답변:


12

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

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

globasciiranges
설정되면, 패턴 일치 괄호 표현식 (패턴 일치 참조)에 사용 된 범위 표현식은 비교를 수행 할 때 기존 C 로케일 에서처럼 작동합니다. 즉, 현재 로케일의 조합 순서는 고려되지 않으므로 'b'는 'A'와 '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
고마워요 [[:upper:]]실제로 알파벳의 일부만 원 하기 때문에 사용할 수 없지만 작동합니다.
rosuav 2016 년

1
@rosuav 환영합니다. 하위 쉘 대안도 확인하십시오.
George Vasiliou

"활성화 된 경우 C 로케일과 동일" -글 로빙에 사용되는 로케일에 영향을 미치며 그 밖의 다른 것은 없습니다. (참조 링크가 도움이 될 것입니다-내가 찾을 수있는 최선의 방법은 gnu.org/software/bash/manual/html_node/Pattern-Matching.html 이지만 모든 쉘 옵션 목록을 선호하지만 globasciiranges가 누락되었습니다 에서 gnu.org/software/bash/manual/html_node/... , 또한 질문 unix.stackexchange.com/questions/227070/... 핸들이 문제를 광범위하게) 또한 버전 4.3에서..
PJTraill

@PjTrail 모든 쇼핑 옵션에 대한 참조 링크가있는 편집 내용을 참조하십시오. 또한 man bash터미널에서 실행 /하고을 사용하여 globasciiranges를 검색 할 수 있습니다 .
George Vasiliou

하지 않을까요 LC_ALL=C printf '%s\n' [A-Z]*두 번째 솔루션을 작동 - 서브 쉘없이? BTW : 오타가 있습니다 : nullblog, 그러나 수정하기에는 너무 적은 문자입니다.
Joe

5

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

[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.


0

세트:

shopt -u nocaseglob

bash 맨 페이지에서 :

>     nocaseglob
>         If  set,  bash matches filenames in a case-insensitive
>         fashion when performing pathname expansion (see Pathname
>          Expansion above).

'globasciiranges'를 설정하면 utf-8과 같은 ASCII가 아닌 문자에 어떤 일이 발생하는지 알 수 없습니다.


0

echo [cC] *도 마찬가지로 원하는대로해야합니다. [A-Za-z] *

나는 시스템에서 globbing 이 대소 문자를 구분 하지 않기 때문에 여기에 왔기 때문에 많은 스크립트가 더 이상 작동하지 않습니다.


그것은 내가보고있는 것과 반대입니다. 그러나 다른 답변을 확인하십시오.
rosuav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.