aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2021-12-21 21:52:29 +0900
committerDenys Vlasenko <vda.linux@googlemail.com>2021-12-25 04:20:28 +0100
commit4fe954c14851d2f913c41c581cbe49300b0984e4 (patch)
treefc3efe9f530d28ba4ab7092a9d966c192ac49e59
parenta05a3d5932b5002d0513adfa817b931dcc1686c0 (diff)
downloadbusybox-w32-4fe954c14851d2f913c41c581cbe49300b0984e4.tar.gz
busybox-w32-4fe954c14851d2f913c41c581cbe49300b0984e4.tar.bz2
busybox-w32-4fe954c14851d2f913c41c581cbe49300b0984e4.zip
sed: do not ignore 'g' modifier when match starts with ^
It is perfectly valid to start a regex with ^ and have other patterns with \| that can match more than once, e.g. the following example should print ca, as illustrated with gnu sed: $ echo 'abca' | sed -e 's/^a\|b//g' ca busybox before patch: $ echo 'abca' | busybox sed -e 's/^a\|b//g' bca busybox after patch: $ echo 'abca' | ./busybox sed -e 's/^a\|b//g' ca regcomp handles ^ perfectly well as illustrated with the second 'a' that did not match in the example, we ca leave the non-repeating to it if appropriate. The check had been added before using regcomp and was required at the time (f36635cec6da) but no longer makes sense now. (tested with glibc and musl libc) function old new delta add_cmd 1189 1176 -13 Signed-off-by: Dominique Martinet <asmadeus@codewreck.org> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/sed.c3
-rwxr-xr-xtestsuite/sed.tests6
2 files changed, 7 insertions, 2 deletions
diff --git a/editors/sed.c b/editors/sed.c
index a6845a979..e8c82ac63 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -435,8 +435,7 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr)
435 switch (substr[idx]) { 435 switch (substr[idx]) {
436 /* Replace all occurrences */ 436 /* Replace all occurrences */
437 case 'g': 437 case 'g':
438 if (match[0] != '^') 438 sed_cmd->which_match = 0;
439 sed_cmd->which_match = 0;
440 break; 439 break;
441 /* Print pattern space */ 440 /* Print pattern space */
442 case 'p': 441 case 'p':
diff --git a/testsuite/sed.tests b/testsuite/sed.tests
index 67ff87e93..2b78c9b12 100755
--- a/testsuite/sed.tests
+++ b/testsuite/sed.tests
@@ -399,6 +399,12 @@ testing "sed uses previous regexp" \
399 "" \ 399 "" \
400 "q\nw\ne\nr\n" 400 "q\nw\ne\nr\n"
401 401
402testing "sed ^ OR not^" \
403 "sed -e 's/^a\|b//g'" \
404 "ca\n" \
405 "" \
406 "abca\n"
407
402# testing "description" "commands" "result" "infile" "stdin" 408# testing "description" "commands" "result" "infile" "stdin"
403 409
404exit $FAILCOUNT 410exit $FAILCOUNT