Ответ 1
На самом деле [A-Za-y]
, и это связано с настройкой языка. Если вы хотите переопределить его, установите $LC_COLLATE
соответствующим образом; либо C
или POSIX
.
Я уже давно заметил, что на некоторых из систем на основе Unix, которые я использую, по крайней мере, ls [A-Z]*
дает мне результаты, которые я ожидал бы от ls [A-Za-z]*
, оставив меня неспособным легко получить список только проклятых файлов, начинающихся с заглавных букв. Я только что столкнулся с тем же, что и с grep
, где я не смог заставить его совместить строчные буквы с [A-Z]
, пока я в конечном итоге не использовал grep -P
для получения регулярного выражения Perl.
Итак, у меня есть некоторые связанные вопросы:
ls
и grep
? (Попытка, например, grep --no-ignore-case
оказалась бесплодной. grep -P
не очень хороший способ обхода из-за его экспериментального статуса функции.)На самом деле [A-Za-y]
, и это связано с настройкой языка. Если вы хотите переопределить его, установите $LC_COLLATE
соответствующим образом; либо C
или POSIX
.
Это зависит от вашего языка. Если вы хотите, чтобы [A..Z]
соответствовал прописным буквам, вы можете использовать C locale: установить LC_COLLATE
или LC_ALL
на C
.
LC_ALL=C
ls [A..Z]*
Unix-оболочки на самом деле не используют регулярные выражения, а шаблоны glob, которые явно отличаются от регулярных выражений. Одно отличие состоит в том, что они неявно привязаны к началу и концу строки - например, ls foo[a-z]
отобразит файл food
, но не fooble
. Это не фактически ls
выполнение соответствия здесь, а сама оболочка. Globs также обычно иногда нечувствительны к регистру (в зависимости от реализации).
Взгляните на man-страницу для вашей любимой интерактивной оболочки и прочитайте о сопоставлении glob - например bash manpage о расширении имени файла описывает который он использует.