А аж задумался: может, у меня grep и есть grep -E, ан нет:
Код: Выделить всё
alias grep='grep --color'
Странно это, что grep ведет себя в разных версиях и на разных локалях совершенно по-разному.
Модераторы: /dev/random, Модераторы разделов
Код: Выделить всё
alias grep='grep --color'
SLEDopit писал(а): ↑10.03.2011 16:55egrep, кстати, тоже ведет себя как sed:/dev/random писал(а): ↑10.03.2011 14:37grep здесь соответствует стандарту, зато sed ведёт себя так, как хотелось бы большинству составителей скриптов.
Код: Выделить всё
$ echo $LANG en_US.UTF-8 $ echo AaBbCc | egrep -o "[a-z]" a b c $ echo AaBbCc | egrep -o "[A-Z]" A B C $ echo abc | egrep -o "[A-Z]"
Код: Выделить всё
$ echo b | egrep [A-C]
b
$ echo b | egrep -o [A-C]
$ echo b | grep -o [A-C]
$
Хм.
Код: Выделить всё
$ grep -V; locale
GNU grep 2.6.3
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
$ echo b | LC_COLLATE=C grep [A-C]
$ echo b | LC_ALL=C grep [A-C]
$ cat /etc/issue
Debian GNU/Linux wheezy/sid \n \l
Да, действительно это из опции -о.
Код: Выделить всё
/* match with range expression? */
#if __GNUC__ >= 2 && ! (__STDC_VERSION__ < 199901L && __STRICT_ANSI__)
wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
#else
wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
cmp_buf[2] = wc;
#endif
for (i = 0; i < cset->nranges; ++i)
{
cmp_buf[0] = cset->range_starts[i];
cmp_buf[4] = cset->range_ends[i];
if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
&& wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
{
match_len = char_len;
goto check_node_accept_bytes_match;
}
}
а вы как хотели? чем меньше однобайтовых динозавров останется в природе (ох уж эта мне америка), тем быстрее будут устраняться (возможные) ошибки в glibc.
гхм. не понял смысла этого regexp-а. он же совпадёт в любом случае.Nazyvaemykh писал(а): ↑12.03.2011 10:45$ echo привет HELLO | sed -n '/[цa-z]*/p'
а тут все так же, как и в grep.
как это «печатается»? находится совпадение? значит, у вас там баг какой-то сидит.
sash-kan писал(а): ↑12.03.2011 16:10гхм. не понял смысла этого regexp-а. он же совпадёт в любом случае.Nazyvaemykh писал(а): ↑12.03.2011 10:45$ echo привет HELLO | sed -n '/[цa-z]*/p'
а тут все так же, как и в grep.
как это «печатается»? находится совпадение? значит, у вас там баг какой-то сидит.
этот _баг_ мне удалось воспроизвести лишь на какой-то древнючей системе. в актуальных дистрибутивахNazyvaemykh писал(а): ↑12.03.2011 17:47QUOTE писал(а):как это «печатается»? находится совпадение? значит, у вас там баг какой-то сидит.
Вот в том-то и дело, что не баг это, а фича. Как в grep, так и в sed.
естественно. потому _багов_ и не наблюдаю.
Nazyvaemykh писал(а): ↑11.03.2011 13:37В стандартной библиотеке C просто нет функций, которые позволили бы развернуть [a-z] в набор символов, которые удовлетворяют этому регулярному выражению.
Код: Выделить всё
int regcomp(regex_t *preg, const char *regex, int cflags);
int regexec(const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags);
size_t regerror(int errcode, const regex_t *preg, char *errbuf,
size_t errbuf_size);
void regfree(regex_t *preg);
не-не-не. никаких installpkg/emerge/etc. максимум — opkg install sed.
/dev/random писал(а): ↑10.03.2011 14:37Ну что тут сказать... grep здесь соответствует стандарту, зато sed ведёт себя так, как хотелось бы большинству составителей скриптов. Формально это баг sed, но, полагаю, что они (да и я, наверное, тоже) назовут это фичой. Надо посмотреть, есть ли это у них в документации.
Код: Выделить всё
ksu@ksu:~/test$ echo HELLO | LC_COLLATE=en_US.UTF-8 sed -n '/[a-z]/p'
ksu@ksu:~/test$ echo HELLO | LC_COLLATE=en_US.UTF-8 sed -n '/[a-z]/Ip'
HELLO
Код: Выделить всё
ksu@ksu:~/test$ echo ФФФФ | LC_COLLATE=ru_RU.UTF-8 sed -n '/[а-я]/Ip'
ФФФФ
ksu@ksu:~/test$ echo ФФФФ | LC_COLLATE=ru_RU.UTF-8 sed -n '/[а-я]/p'
ksu@ksu:~/test$
Nazyvaemykh писал(а): ↑14.03.2011 18:04Вы, ребята, молодцы, но вот кто и как собирал grep в Squeeze, что он столь неожиданно матчит…