Что происходит с [A-Z], что означает [A-Za-z]?

я заметил, что на некоторых Unix - системах, которые я использую, по крайней мере,ls [A-Z]* дает мне результаты, которые я ожидаю от ls [A-Za-z]*, оставив меня неспособным легко получить список только проклятых файлов, которые начинаются с заглавных букв. Я только что столкнулся с тем же самым с grep, где я не мог заставить его перестать сопоставлять строчные буквы с [A-Z] пока я в конце концов не использовал grep -P чтобы получить Perl regex.

поэтому у меня есть некоторые связанные вопросы:

  1. когда начался этот идиотизм?
  2. кто несет ответственность и должен быть наказан?
  3. почему???
  4. есть ли какой-то достаточно простой обходной путь для одного или обоих ls и grep случаях? (Пытаясь, например, grep --no-ignore-case было бесплодно. grep -P это не очень хорошее решение из-за его экспериментальный статус.)

3 ответов


на самом деле [A-Za-y], и это связано с сортировки языке. Если вы хотите переопределить его, установите $LC_COLLATE надлежащим образом; либо C или POSIX должны сделать.


Это зависит от вашей локали. Если вы хотите этого [A..Z] соответствует только заглавным буквам, вы можете использовать C locale: set LC_COLLATE или LC_ALL to C.

LC_ALL=C
ls [A..Z]*

руководство bash, шаблоны


оболочки Unix фактически не используют регулярные выражения, но glob patterns, которые существенно отличаются от регулярных выражений. Одно из различий заключается в том, что они неявно привязаны к началу и концу строки - например,ls foo[a-z] будет список файл food, а не fooble. На самом деле это не ls выполнение сопоставления здесь, но сама оболочка. Глобусы также обычно иногда регистр (в зависимости от реализация.)

взгляните на manpage для вашей любимой интерактивной оболочки и прочитайте о Glob matching-например страница bash о расширении имени файла описывает синтаксис, который он использует.