[git commit] grep: Fix -f FILE when FILE is empty and -x provided

Denys Vlasenko vda.linux at googlemail.com
Wed Apr 29 14:01:42 UTC 2020


commit: https://git.busybox.net/busybox/commit/?id=c3295d233b6a7d924814eec9a5c5999a876daf9e
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

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 at wolfsden.cz>
Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 findutils/grep.c     | 5 +++--
 testsuite/grep.tests | 6 ++++++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/findutils/grep.c b/findutils/grep.c
index 5b8644c36..84a6f7b1c 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -762,8 +762,9 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
 	if (option_mask32 & OPT_f) {
 		load_regexes_from_file(fopt);
 		if (!pattern_head) { /* -f EMPTY_FILE? */
-			/* GNU grep treats it as "nothing matches" */
-			llist_add_to(&pattern_head, new_grep_list_data((char*) "", 0));
+			/* GNU grep treats it as "nothing matches" except when -x */
+			const char *data = (option_mask32 & OPT_x) ? ".*" : "";
+			llist_add_to(&pattern_head, new_grep_list_data((char*)data, 0));
 			invert_search ^= 1;
 		}
 	}
diff --git a/testsuite/grep.tests b/testsuite/grep.tests
index 26f8e69cf..9c1f35499 100755
--- a/testsuite/grep.tests
+++ b/testsuite/grep.tests
@@ -129,6 +129,12 @@ testing "grep -v -f EMPTY_FILE" \
 	"" \
 	"test\n"
 
+testing "grep -vxf EMPTY_FILE" \
+	"grep -vxf input" \
+	"test\n" \
+	"" \
+	"test\n"
+
 testing "grep -Fw matches only words" \
 	"grep -Fw foo input" \
 	"" \


More information about the busybox-cvs mailing list