Подтвердить что ты не робот

Что случилось с [A-Z], что означает [A-Za-z]?

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

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

  • Когда начался этот идиотизм?
  • Кто несет ответственность и должен быть наказан?
  • ПОЧЕМУ???
  • Существует ли какой-либо разумный способ обхода для одного или обоих случаев ls и grep? (Попытка, например, grep --no-ignore-case оказалась бесплодной. grep -P не очень хороший способ обхода из-за его экспериментального статуса функции.)
4b9b3361

Ответ 1

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

Ответ 2

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

LC_ALL=C
ls [A..Z]*

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

Ответ 3

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

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