2011-01-29 8 views
12

필자는 적어도 유닉스 기반 시스템 중 일부에서 적어도 ls [A-Z]*을 사용하여 내가 ls [A-Za-z]*에서 기대할 수있는 결과를 얻었음을 알아 차 렸습니다. 파일은 대문자로 시작합니다. 방금 grep을 사용하여 같은 결과를 얻었습니다. [A-Z]과 소문자를 일치시키지 못하게되어 결국 을 사용하여 Perl 정규식을 얻었습니다. [A-Z]는 [A-Za-z]를 의미합니까?

  1. 이 바보 같은 짓을 시작 않았다

    그래서 나는 몇 가지 관련 질문이?
  2. 누가 책임을지며 처벌되어야합니까?
  3. 왜요?
  4. lsgrep 사례 중 하나 또는 모두에 대해 비교적 간단한 해결 방법이 있습니까? (노력, 예를 들어, grep --no-ignore-case 보람이었다. grep -P 때문에 실험적인 기능 상태의 아주 좋은 해결 방법이 아니다.)
+1

'[[: upper :]]'는 다른 옵션입니다. – wnoise

+0

아, 고마워. 나는 그 구조에 어떤 종류의 알레르기가 있고 그것들을 생각하지 않습니다. – chaos

+0

뭔가 다른 것을 찾고있을 때 우연히 마주 쳤습니다. 관련 질문으로 인해 나를 상처 입었습니다. :-) – KSwift87

답변

15

실제로 [A-Za-y]이고, 그것은 언어의 조합과 관련이있다. 그것을 무시하려면 을 적절히 설정하십시오. C 또는 POSIX 중 하나를 사용해야합니다.

+0

오, 고마워요. '[A-Za-y]'? 나는 묻기가 두렵다. 왜 'y'가 아닌 'z'인가? – chaos

+0

'Z'는 대조 순서에서 'z'앞에 있기 때문에. –

+3

이 깨진 로케일에서 [A-Z]는 [AaBbCcDd .... YyZ]로 바뀝니다. – wnoise

3

지역에 따라 다릅니다. [A..Z]이 대문자 만 일치 시키려면 C 로케일을 사용하십시오. LC_COLLATE 또는 LC_ALLC으로 설정하십시오. 정규 표현식에에서 분명히 다른

LC_ALL=C 
ls [A..Z]* 

bash manual, pattern matching

+1

그러나이 단점은 당신이'ls'을 할 때 모든 대문자 파일을 먼저 얻은 다음 모든 소문자를 얻게된다는 것입니다. 결과적으로 대부분의 경우 두 곳을 살펴 봐야합니다. 파일은 대문자 또는 소문자로 시작하는지 기억할 수 없습니다.;-) –

-1

유닉스 쉘이 실제로 정규 표현식을 사용하지 않는,하지만 글로브 패턴. 한 가지 차이점은 문자열의 시작과 끝에 암시 적으로 고정되어 있다는 점입니다. ls foo[a-z]은 파일 food을 표시하지만 fooble은 표시하지 않습니다. 실제로는 ls이 아니라 쉘 자체와 일치합니다. 글로브는 또한 이고 보통 가끔 인 경우는 (구현에 따라 다름)입니다.

좋아하는 대화 형 셸의 맨 페이지를보고 glob 일치에 대해 읽습니다. 예를 들어 bash's manpage about filename expansion은 사용하는 구문을 설명합니다.

+1

쉘이 regexps가 아닌 glob을 사용하는 것이 맞지만 glob는 대소 문자를 구분합니다. – wnoise

+0

@wnoise : 흠, 그 부분은 구현에 달려 있다고 생각합니다. 나는 더 많은 연구를 할 것이다. – Ether