Логика различия границ слов между BSD grep и GNU grep

Может кто-нибудь объяснить / помочь мне понять логику этой разницы между BSD grep и GNU grep? Я добавил вставки под спичками.

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD
$ cat t1 
admin:*:80:root
$ grep '\<.' t1
admin:*:80:root
^^^^^   ^^ ^^^^

против

$ grep --version
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.

$ cat t1 
admin:*:80:root
$ grep '\<.' t1
admin:*:80:root
^       ^  ^   

Кажется, что GNU grep делает это правильно, а BSD grep — нет. Я думал, что \< должен получить границу слова? Примечание grep '\<ad' t1, похоже, дает одинаковый результат в обеих версиях, например:

$ cat t2
admin:*:80:root
sadmin:*:81:root
$ grep '\<ad' t2
admin:*:80:root
^^

Что дает?

Заранее спасибо.

Ричард


person Exit42    schedule 31.07.2013    source источник


Ответы (1)


Использование \> для указания границы слова не будет работать для BSD grep. Вместо этого попробуйте [[:<:]].

Этот пост содержит довольно полезную информацию о границах слов. для различных коммунальных услуг.

person devnull    schedule 05.08.2013
comment
Меня уже давно раздражает, что сопоставление регулярных выражений для границ слов имеет раздражающую зависимость от реализации. Серьезно. - person Exit42; 07.08.2013