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;
}