Объясните, пожалуйста, что происходит?# cat file.txt
ABCDEFGH
# egrep -o "^A" file.txt
A
# egrep -o "^B" file.txt
# egrep -o "^A|^B|^C|^D|^E|^F|^G|^H" file.txt
A
B
C
D
E
F
G
H
# egrep -c "^A|^B|^C|^D|^E|^F|^G|^H" file.txt
1
#
> Объясните, пожалуйста, что происходит?Ставлю на то, что -- FreeBSD! :-/
Очевидно, ключ -o в этой реализации "обрезает" входную строку перед следующим сравнением, и начало строки оказывается на "следующей" первой букве.
...
"У меня всё работает."(тм)$ cat >file.txt
ABCDEFGH
$ egrep -o "^A|^B|^C|^D|^E|^F|^G|^H" file.txt
A
$ egrep --version
GNU grep 2.5.3Copyright (C) 1988, 1992-2002, 2004, 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$ _
>> Объясните, пожалуйста, что происходит?
> Ставлю на то, что -- FreeBSD! :-//var/log > egrep -V
egrep (GNU grep) 2.5.1-FreeBSD> Очевидно, ключ -o в этой реализации "обрезает" входную строку перед следующим
> сравнением, и начало строки оказывается на "следующей" первой букве.Ну, как бы очевидно, что все происходит примерно так, но неочевидно, почему оно так происходит. По логике строго не должно. Категорически.
Хорошо, что в некоторых версиях оно работает правильно, потому что если б во всех - пришлось бы менять взгляды на окружающую реальность.
>>> Объясните, пожалуйста, что происходит?
>> Ставлю на то, что -- FreeBSD! :-/
> egrep (GNU grep) 2.5.1-FreeBSDКакой оголтелый позиксивизм с юниксвеем... :-O
>> Очевидно, ключ -o в этой реализации "обрезает" входную строку перед следующим
>> сравнением, и начало строки оказывается на "следующей" первой букве.
>все происходит примерно так, но неочевидно, почему оно так происходит.Ошибка реализации обыкновенная.
Обновлять порты немедленно? ...или ставить gnu grep и писать багрипорт о возмутительной идеологической невыдержанности /bin/grep версии такой-то.
> По логике строго не должно. Категорически.
"Ну, кто ж знал-то?!"(c)изобретатели двухколёсных идеологически подкованных
:-j
>> egrep (GNU grep) 2.5.1-FreeBSD
> ставить gnu grepОй! Да это ж он и есть??! 8-O
>> Категорически.
>>> egrep (GNU grep) 2.5.1-FreeBSD
>> ставить gnu grep
> Ой! Да это ж он и есть??! 8-OДык, почти все волосы на жопе от отчаяния повырывал...
>>> egrep (GNU grep) 2.5.1-FreeBSD
>> ставить gnu grep
> Ой! Да это ж он и есть??! 8-OДетальное вскрытие показало, что болячка присутствует у всех версий гну-грепа 2.х.х младше 2.5.2, а также у pcre 8.хх. Учитывая, что пцрешный движок используется чуть менее, чем везде (включая экзим), разослал тучу багрепортов. Уже отписались фришники и пцрешники. Ждем ебилдов.
> "Ну, кто ж знал-то?!"(c)изобретатели двухколёсных идеологически подкованныхНапомнило старое:
- А почему вы написали "от 20 до 150 килотонн"?
- Мы думали - там 20, а оно как бабахнет...
> Очевидно, ключ -o в этой реализации "обрезает" входную строку перед следующим
> сравнением, и начало строки оказывается на "следующей" первой букве.Оказывается - нет :)
# cat >file.txt
HGFEDCBA
^D
# egrep -o "^A|^B|^C|^D|^E|^F|^G|^H" file.txt
H
G
F
E
D
C
B
A
#Чудеса, да и только...
>> Очевидно, ключ -o в этой реализации "обрезает" входную строку перед следующим
>> сравнением, и начало строки оказывается на "следующей" первой букве.
> Оказывается - нет :)Чего "нет"-то? Не "очевидно" что ли? %)
> # cat >file.txt
> HGFEDCBA
> ^D
> # egrep -o "^A|^B|^C|^D|^E|^F|^G|^H" file.txt
> H
> GПервая буква (во входной строке, не в паттерне) сопоставилась, вывели-отбросили, входная строка приняла вид GFEDCBA, следующей сопоставилась "первая" буква G.
> Первая буква (во входной строке, не в паттерне) сопоставилась, вывели-отбросили, входная
> строка приняла вид GFEDCBA, следующей сопоставилась "первая" буква G.Согласен.
Так или иначе, забагрепортил. Полдня убил на локализацию косяка.
> Так или иначе, забагрепортил. Полдня убил на локализацию косяка.Это наблюдается только под фряхой или в линуксах тоже так?
> Это наблюдается только под фряхой или в линуксах тоже так?Это наблюдается везде. Просто во фре еще с пятого релиза по 8.2 штатно идет гну-греп версии 2.5.1. Там, где используется хотя бы 2.5.2 - бага нет. В убунте вообще 2.6.3 уже.
Хуже всего то, что аналогичный косяк наблюдается в PCRE. И версии без бага просто не существует. А PCRE используется как движок для RE чуть ли не везде. Апач, пхп, экзим. Во фре достаточно команды
pkg_info -Rr pcre*
чтобы увидеть, где косяки есть.