Почему [a-z] {3} и [[: lower:]] {3} отличаются в egrep? - PullRequest
1 голос
/ 27 декабря 2011

Пожалуйста, попробуйте

egrep "^[a-z]{3}$" /usr/share/dict/words

egrep "^[[:lower:]]{3}$" /usr/share/dict/words

Первый возвращает как заглавные, так и строчные слова.Второй возвращает только строчные слова.

Ответы [ 2 ]

4 голосов
/ 27 декабря 2011

Это связано с вашей настройкой локали.Если вы установите для LC_ALL значение C, оно должно работать должным образом.

Из справочной страницы egrep в Ubuntu 11.04:

В выражении в скобках выражение диапазонасостоит из двух символов, разделенных дефисом.Он соответствует любому отдельному символу, который сортируется между двумя символами включительно, с использованием последовательности сортировки и набора символов языкового стандарта.

Например, в языковом стандарте C по умолчанию [a-d] эквивалентно [abcd].Многие локали сортируют символы в порядке словаря, и в этих локалях [a-d] обычно не эквивалентно [abcd];например, это может быть эквивалентно [aBbCcDd].Чтобы получить традиционную интерпретацию скобочных выражений, вы можете использовать локаль C, задав для переменной среды LC_ALL значение C.

. Вы можете попробовать команды из следующего транскрипта для подтверждения.это:

pax$ egrep "^[a-z]{3}$" /usr/share/dict/words | head -5l
AOL
Abe
Ada
Ala
Ali
pax$ LC_ALL=C egrep "^[a-z]{3}$" /usr/share/dict/words | head -5l
ace
act
add
ado
ads
1 голос
/ 27 декабря 2011

Ты уверен?В моей системе (OS X Snow Leopard) обе команды возвращают одинаковые результаты;только слова из 3 букв в нижнем регистре.

$ egrep "^[a-z]{3}$" /usr/share/dict/words | wc -l
    1134
$ egrep "^[[:lower:]]{3}$" /usr/share/dict/words | wc -l
    1134

$ egrep "^[[:lower:]]{3}$" /usr/share/dict/words | md5
0a66d5e78cfbe6f9f66d2d90b1053972
$ egrep "^[a-z]{3}$" /usr/share/dict/words | md5
0a66d5e78cfbe6f9f66d2d90b1053972

Какую систему вы используете?Возможно, попробуйте man egrep и найдите вариант чувствительности к регистру.egrep, поставляемый с OSX, предлагает только противоположное -i, --ignore-case ignore case distinctions.

Обновление:

Я также проверил это на Linux CentX Box также:

$ egrep "^[a-z]{3}$" /usr/share/dict/words | wc -l
2044
$ egrep "^[[:lower:]]{3}$" /usr/share/dict/words | wc -l
2044
$ egrep "^[a-z]{3}$" /usr/share/dict/words | md5sum 
480fb21554f9f731adddb0d648157926  -
$ egrep "^[[:lower:]]{3}$" /usr/share/dict/words | md5sum 
480fb21554f9f731adddb0d648157926  -

Обновление № 2:

Ваши комментарии показывают, что вы можете передавать -i или --ignore-case в egrep.Отключите это, чтобы получить только результаты нижнего регистра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...