이것예숙제 질문:
소문자로 시작하지만 대문자로 끝나지 않는 2개 이상의 문자를 포함하는 모든 파일 이름과 일치합니다.
내 솔루션이 작동하지 않는 이유를 이해할 수 없습니다.
그래서 나는 다음을 수행했습니다.
touch aa
touch ha
touch ah
touch hh
touch a123e
touch hX
touch Ax
ls [a-z]*[!A-Z]
산출:
aa ha
내 질문: "ah", "hh" 또는 "a123e"와 일치하지 않는 이유는 무엇입니까?
답변1
이것은로케일질문. 귀하의 로케일에서는 (아마도 다른 악센트 문자로) [A-Z]
확장되므로 실제로 귀하의 예에서는 (그리고 귀하의 예에서만) "로 끝나는 파일"을 의미합니다 .[AbBcZ...zZ]
[^A-Z]
a
이러한 예상치 못한 상황을 피하려면 LC_COLLATE=C
데이터 정렬이 정렬 순서를 담당하는 로캘의 일부이므로 이를 수행하는 한 가지 방법은 설정하는 것입니다. 또한 LC_ALL
설정된 경우 우선순위가 적용되므로 비워 두세요.
$ ls [a-z]*[^A-Z]
aa ha
$ ( LC_ALL=; LC_COLLATE=C; ls [a-z]*[^A-Z] )
a123e aa ah ha hh
또는 더 나은 방법은 로케일을 변경하지 말고 [:lower:]
대신 [a-z]
및 [:upper:]
대신에 적절한 클래스를 사용하는 것입니다 [A-Z]
.
$ ls [[:lower:]]*[^[:upper:]]
a123e aa ah ha hh
또는 bash의 globasciiranges
옵션을 사용하십시오.
$ shopt -s globasciiranges
$ ls [a-z]*[^A-Z]
a123e aa ah ha hh
$ shopt -u globasciiranges
$ ls [a-z]*[^A-Z]
aa ha