grep: fix grep -x to not set REG_NOSUB
When -F isn't specified (and !ENABLE_EXTRA_COMPAT), grep -x uses regexec's regmatch_t output to determine if the match was the entire line. However it also set the REG_NOSUB flag which makes it ignore the regmatch_t argument. Add an exception to the setting of REG_NOSUB for OPT_x and add some test cases to test the behaviour of -x. Signed-off-by: James Hogan <james.hogan@imgtec.com> Cc: Natanael Copa <ncopa@alpinelinux.org> Cc: Denys Vlasenko <vda.linux@googlemail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
aa94130f74
commit
5fc0585c01
@ -716,7 +716,7 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
|
||||
option_mask32 |= OPT_F;
|
||||
|
||||
#if !ENABLE_EXTRA_COMPAT
|
||||
if (!(option_mask32 & (OPT_o | OPT_w)))
|
||||
if (!(option_mask32 & (OPT_o | OPT_w | OPT_x)))
|
||||
reflags = REG_NOSUB;
|
||||
#endif
|
||||
|
||||
|
@ -82,6 +82,20 @@ testing "grep -F handles -i" "grep -F -i foo input ; echo \$?" \
|
||||
testing "grep can read regexps from stdin" "grep -f - input ; echo \$?" \
|
||||
"two\nthree\n0\n" "tw\ntwo\nthree\n" "tw.\nthr\n"
|
||||
|
||||
# -x (whole line match)
|
||||
testing "grep -x (full match)" "grep -x foo input ; echo \$?" \
|
||||
"foo\n0\n" "foo\n" ""
|
||||
testing "grep -x (partial match 1)" "grep -x foo input ; echo \$?" \
|
||||
"1\n" "foo bar\n" ""
|
||||
testing "grep -x (partial match 2)" "grep -x foo input ; echo \$?" \
|
||||
"1\n" "bar foo\n" ""
|
||||
testing "grep -x -F (full match)" "grep -x -F foo input ; echo \$?" \
|
||||
"foo\n0\n" "foo\n" ""
|
||||
testing "grep -x -F (partial match 1)" "grep -x -F foo input ; echo \$?" \
|
||||
"1\n" "foo bar\n" ""
|
||||
testing "grep -x -F (partial match 2)" "grep -x -F foo input ; echo \$?" \
|
||||
"1\n" "bar foo\n" ""
|
||||
|
||||
optional FEATURE_GREP_EGREP_ALIAS
|
||||
testing "grep -E supports extended regexps" "grep -E fo+" "foo\n" "" \
|
||||
"b\ar\nfoo\nbaz"
|
||||
|
Loading…
Reference in New Issue
Block a user