I recently learned that our grep does not support the \<\> syntax for word boundaries, only the somewhat more difficult to use [[:<:]] format. It's fairly easy to convert one to the other however.
Index: grep.c =================================================================== RCS file: /home/tedu/cvs/src/usr.bin/grep/grep.c,v retrieving revision 1.44 diff -u -p -r1.44 grep.c --- grep.c 8 Jul 2011 01:20:24 -0000 1.44 +++ grep.c 17 Jul 2011 15:38:58 -0000 @@ -163,6 +163,54 @@ struct option long_options[] = {NULL, no_argument, NULL, 0} }; +#ifndef SMALL +char * +fix_word_boundaries(char *pat) +{ + size_t newlen; + int bs, repl; + char c, *newpat, *p, *r; + + repl = 0; + p = pat; + while ((p = strstr(p, "\\<"))) { + p += 2; + repl++; + } + p = pat; + while ((p = strstr(p, "\\>"))) { + p += 2; + repl++; + } + if (!repl) + return pat; + newlen = strlen(pat) + 1 + repl * 5; + newpat = grep_malloc(newlen); + p = pat; + r = newpat; + bs = 0; + while ((c = *p++)) { + if (bs && (c == '<' || c == '>')) { + /* overwrite previous backspace */ + snprintf(r-1, 8, "[[:%c:]]", c); + r += 6; + bs = 0; + continue; + } else if (!bs && c == '\\') { + bs = 1; + } else { + bs = 0; + } + *r++ = c; + } + *r = 0; + if (newlen <= strlen(newpat)) + abort(); + free(pat); + return newpat; + +} +#endif static void add_pattern(char *pat, size_t len) @@ -198,6 +246,12 @@ add_pattern(char *pat, size_t len) pattern[patterns] = grep_malloc(len + 1); memcpy(pattern[patterns], pat, len); pattern[patterns][len] = '\0'; +#ifndef SMALL + if (!Fflag) { + pattern[patterns] = fix_word_boundaries(pattern[patterns]); + } +#endif + } ++patterns; }