commit 1ca8a314f80274d06c887aa347ecb142487a946d
parent 7ed4866556a8208d8d0470e1dd1a4c0df68039b2
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 2 Nov 2014 03:08:12 +0000
grep: Remove newlines before matching a line
Otherwise, a pattern with a '$' anchor will never match and POSIX says that
"By default, an input line shall be selected if any pattern ... matches any
part of the line excluding the terminating <newline>"
Diffstat:
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/grep.c b/grep.c
@@ -129,6 +129,9 @@ grep(FILE *fp, const char *str)
int match = NoMatch;
for(n = 1; (len = agetline(&buf, &size, fp)) != -1; n++) {
+ /* Remove the trailing newline if one is present. */
+ if (len && buf[len - 1] == '\n')
+ buf[len - 1] = '\0';
for(pnode = phead; pnode; pnode = pnode->next) {
if(regexec(&pnode->preg, buf, 0, NULL, 0) ^ vflag)
continue;
@@ -146,9 +149,7 @@ grep(FILE *fp, const char *str)
printf("%s:", str);
if(mode == 'n')
printf("%ld:", n);
- printf("%s", buf);
- if(len && buf[len - 1] != '\n')
- putchar('\n');
+ puts(buf);
break;
}
match = Match;