LINUX.ORG.RU

regexp в egrep


0

0

Hi All!

Кто-нибудь может ответить на вопрос почему происходит так:

> echo "_8_5" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false

true


> echo "_8_6" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false

false


> echo "_8_6" | egrep -q '^(_(2[0-5]|[0-9])){2}$' && echo true || echo false

true

Разве операция '|' не коммутативна? Почему во втором случае нет совпадения?

bash-2.05b$ echo "_8_5" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false 
true
bash-2.05b$ echo "_8_6" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false 
true
bash-2.05b$ echo "_8_6" | egrep -q '^(_(2[0-5]|[0-9])){2}$' && echo true || echo false
true
bash-2.05b$ egrep --version
egrep (GNU grep) 2.5

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение; смотрите исходные
тексты для условий копирования. НЕ дается никакой гарантии, даже о
ПОДХОДИМОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ.

bash-2.05b$

cvv ★★★★★
()

Да, есть такая штука. Иди на groups.google.com, ищи
"egrep bug 2.5.1" или там "grep bug 2.5.1 UTF"
Если бы ты не поленился и погуглил то сразу бы нашел кучу обсуждений.

На моей машине:

$ egrep --version
egrep (GNU grep) 2.5.1
$
$ export LANG=en_US
$ echo "_8_6" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false
true
$
$ export LANG=en_US.UTF-8
$ echo "_8_6" | egrep -q '^(_([0-9]|2[0-5])){2}$' && echo true || echo false
false

Onanim
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.