2

Рассматривать:

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 '[Dd][eE][sS][cC][eE][nN][dD] ?[Ff][rR][oO][mM]'
real    0m0.438s

$ time lzop -d < tvtropes-index.lzo | egrep -B 5 'descend ?from' -i
real    0m11.294s

Оба поиска регистрозависимы. Почему версия -i такая медленная? Как сделать grep -i быстрым, не вводя такие вещи, как [iI] [nN] [tT] [hH] [iI] [sS] [wW] [aA] [Yy]?

Например,

perl -ne 'print if /descend ?from/i'

работает быстро, но '-B 5' не так тривиально для реализации, как в grep (как и другие опции).

3 ответа3

7

Сложный чехол сложный

Простое сопоставление [az] с [AZ] работает для большинства простых текстовых документов только для ASCII. Тем не менее, он начинает разрушаться, когда мы исследуем другие языки, которые используют дополнительные символы. Также не учитывается тот факт, что сопоставления падежа в некоторых языках не всегда являются алгоритмическими или статическими.

Например, если вы сложите регистр [az] -> [AZ], строка типа "Dürst" или "резюме" может в конечном итоге выглядеть немного странно: "DüRST" или "RéSUMé".

Вы могли бы ускорить его, убедив grep, что мир снова является ASCII, либо используя древний grep, либо играя с локалями (LC_ALL = C?).

В этом разговоре упоминается «значительное замедление работы в локалях UTF8», но это не помогает.

2

гипотеза

Эти противоречивые результаты объясняются этим. Ваше регулярное выражение не совпадает с grep -i потому что grep -i является более общим, учитывая сложную обработку многобайтовой строки, по крайней мере, при компиляции с символом препроцессора MBS_SUPPORT .

Посмотрите здесь:

http://cvs.savannah.gnu.org/viewvc/grep/grep/src/search.c?revision=1.42&view=markup

Ищите match_icase и MBS_SUPPORT .

0

Если фактический случай поиска не является критическим, вы можете использовать tr чтобы сложить [A-Z] до [a-z] перед grep .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .