Что случилось с [AZ], означающим [A-Za-z]? - PullRequest
12 голосов
/ 29 января 2011

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

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

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

Ответы [ 3 ]

15 голосов
/ 29 января 2011

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

3 голосов
/ 29 января 2011

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

LC_ALL=C
ls [A..Z]*

руководство по bash, сопоставление с образцом

0 голосов
/ 29 января 2011

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

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

...