Что происходит с [A-Z], что означает [A-Za-z]?
я заметил, что на некоторых Unix - системах, которые я использую, по крайней мере,ls [A-Z]*
дает мне результаты, которые я ожидаю от ls [A-Za-z]*
, оставив меня неспособным легко получить список только проклятых файлов, которые начинаются с заглавных букв. Я только что столкнулся с тем же самым с grep
, где я не мог заставить его перестать сопоставлять строчные буквы с [A-Z]
пока я в конце концов не использовал grep -P
чтобы получить Perl regex.
поэтому у меня есть некоторые связанные вопросы:
- когда начался этот идиотизм?
- кто несет ответственность и должен быть наказан?
- почему???
- есть ли какой-то достаточно простой обходной путь для одного или обоих
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]*
оболочки Unix фактически не используют регулярные выражения, но glob patterns, которые существенно отличаются от регулярных выражений. Одно из различий заключается в том, что они неявно привязаны к началу и концу строки - например,ls foo[a-z]
будет список файл food
, а не fooble
. На самом деле это не ls
выполнение сопоставления здесь, но сама оболочка. Глобусы также обычно иногда регистр (в зависимости от реализация.)
взгляните на manpage для вашей любимой интерактивной оболочки и прочитайте о Glob matching-например страница bash о расширении имени файла описывает синтаксис, который он использует.