diff --git a/findutils/grep.c b/findutils/grep.c index 84a6f7b1c..55e9c0a8f 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -650,6 +650,13 @@ static void load_regexes_from_file(llist_t *fopt) } } +static void load_pattern_list(llist_t **lst, char *pattern) +{ + char *p; + while ((p = strsep(&pattern, "\n")) != NULL) + llist_add_to(lst, new_grep_list_data(p, 0)); +} + static int FAST_FUNC file_action_grep(const char *filename, struct stat *statbuf, void* matched, @@ -754,10 +761,12 @@ int grep_main(int argc UNUSED_PARAM, char **argv) #endif invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */ - { /* convert char **argv to grep_list_data_t */ - llist_t *cur; + { /* convert char **argv to pattern_list */ + llist_t *cur, *new = NULL; for (cur = pattern_head; cur; cur = cur->link) - cur->data = new_grep_list_data(cur->data, 0); + load_pattern_list(&new, cur->data); + llist_free(pattern_head, NULL); + pattern_head = new; } if (option_mask32 & OPT_f) { load_regexes_from_file(fopt); @@ -806,11 +815,9 @@ int grep_main(int argc UNUSED_PARAM, char **argv) /* if we didn't get a pattern from -e and no command file was specified, * first parameter should be the pattern. no pattern, no worky */ if (pattern_head == NULL) { - char *pattern; if (*argv == NULL) bb_show_usage(); - pattern = new_grep_list_data(*argv++, 0); - llist_add_to(&pattern_head, pattern); + load_pattern_list(&pattern_head, *argv++); } /* argv[0..(argc-1)] should be names of file to grep through. If diff --git a/testsuite/grep.tests b/testsuite/grep.tests index 9c1f35499..e38278810 100755 --- a/testsuite/grep.tests +++ b/testsuite/grep.tests @@ -190,6 +190,18 @@ testing "grep -x -v -e EXP1 -e EXP2 finds nothing if either EXP matches" \ "" \ " aa bb cc\n" +testing "grep PATTERN can be a newline-delimited list" \ + 'grep -Fv "$(printf "foo\nbar\n")"' \ + "baz\n" \ + "" \ + "foo\nbar\nbaz\n" + +testing "grep -e PATTERN can be a newline-delimited list" \ + 'grep -Fv -e "$(printf "foo\nbar\n")"' \ + "baz\n" \ + "" \ + "foo\nbar\nbaz\n" + # -r on symlink to dir should recurse into dir mkdir -p grep.testdir/foo echo bar > grep.testdir/foo/file