[#]
GNU Grep 2.19: быстрее от 10 до 200 раз
spline(station13, 1) — All
2014-05-23 17:00:03
Cегодня вышла новая версия программы GNU Grep 2.19. Джим Мейеринг (Jim Meyering) сообщает, что за 13 недель, прошедших со времени выхода прошлой версии, 4 разработчика сделали 152 коммита. Особое спасибо Норихиро Танака (Norihiro Tanaka) и Паулю Эггерту (Paul Eggert).Улучшения
* Значительно улучшена производительность, в типичных случаях на 10% и в некоторых случаях в 200 раз. Однако, производительность grep -P (то есть, при работе с регулярными выражениями с стиле Perl) в юникодных локалях стала только хуже. Это связано с исправлениями ошибок, которые могли приводить к падениям (см. ниже).
Исправление ошибок
* grep больше не ошибается при работе с паттернами, навроде [a-[.z.]] (напоминаю, что [.z.] обозначает collating symbol)
Например, раньше в испаноамериканской локали grep работал не верно, а теперь работает правильно:
echo b | LC_ALL=es_US.UTF-8 grep '[a-[.ch.]]'
echo $ echo b | LC_ALL=es_US.UTF-8 ../src/grep '[a-[.ch.]]'
b
Так же исправлена ошибка, когда неправильно обрабатывались регулярные выражения типа [^a], где a — collating symbol.
* grep больше не ошибается с пустыми регулярными выражениями, когда пустое регулярное выражение присутствует в списке паттернов. Если в списке паттернов присутствует пустая строка, то должны матчится все всходные строки.
Например, в 2.18:
$ pat='hello
'
$ echo world | grep -e "$pat"
world
$pat='\(\)\1hello
'
$ echo world | grep -e "$pat"
$
(эта ошибка появилась в версии 2.5);
* grep -C NUM педантично печатает разделитель,когда NUM равно 0, аналогично для -A и -B (ошибка присутствовала изначально);
* grep, grep -F, grep -E теперь обрабатывают ошибки в кодировке паттернов таким же образом, как их обрабатывает движок обработки регулярных выражений GNU, учитывая, может ли ошибка матчить части многобайтовых символов в данных (ошибка присутствовала изначально).
* grep -w теперь правильно работает в многобайтовых локалях. То же касается паттернов '\', '\b', '\B':
$ echo 'Привет, Мир' | grep '\<М'
$
$ echo 'Привет, Мир' | grep '\<М'
Привет, Мир
$
(ошибка присутствовала изначально);
* grep -P теперь сообщает об ошибке и выходит, когда на вход поступают некорректные данные в кодировке UTF-8. Раньше программа могла упасть или зациклиться (ошибка появилась в grep-2.16);
* grep -Pw теперь работает аналогично grep -w, искомая строка должна быть окружена символами, которые не могут быть частью какого-либо слова.
Ранее, например, echo a@@a| grep -Pw @@ матчила строку, а cho a@@a| grep -w @@ — нет. Теперь работают одинаково и строку не матчат.
* grep -i теперь правильно обрабатывает паттеры, содержащие символы в верхнем регистре. Например, в локали, содержащей символ 'Lj' (U+01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J), 'grep -i Lj' теперь матчит и строку 'LJ' (U+01C7 LATIN CAPITAL LETTER LJ), и lj' (U+01C9 LATIN SMALL LETTER LJ).