grep: Fix -f FILE when FILE is empty and -x provided

Grep currently special-cased empty pattern file to be the same as
pattern file with one empty line (empty pattern). That does mirror how
GNU grep behaves, except when -x is provided. In that case .* pattern
needs to be used instead.

Signed-off-by: Gray Wolf <wolf@wolfsden.cz>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Gray Wolf 2020-04-29 15:49:17 +02:00 committed by Denys Vlasenko
parent 1c462d47a0
commit c3295d233b
2 changed files with 9 additions and 2 deletions

View File

@ -762,8 +762,9 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
if (option_mask32 & OPT_f) { if (option_mask32 & OPT_f) {
load_regexes_from_file(fopt); load_regexes_from_file(fopt);
if (!pattern_head) { /* -f EMPTY_FILE? */ if (!pattern_head) { /* -f EMPTY_FILE? */
/* GNU grep treats it as "nothing matches" */ /* GNU grep treats it as "nothing matches" except when -x */
llist_add_to(&pattern_head, new_grep_list_data((char*) "", 0)); const char *data = (option_mask32 & OPT_x) ? ".*" : "";
llist_add_to(&pattern_head, new_grep_list_data((char*)data, 0));
invert_search ^= 1; invert_search ^= 1;
} }
} }

View File

@ -129,6 +129,12 @@ testing "grep -v -f EMPTY_FILE" \
"" \ "" \
"test\n" "test\n"
testing "grep -vxf EMPTY_FILE" \
"grep -vxf input" \
"test\n" \
"" \
"test\n"
testing "grep -Fw matches only words" \ testing "grep -Fw matches only words" \
"grep -Fw foo input" \ "grep -Fw foo input" \
"" \ "" \