[PATCH] sed: do not ignore 'g' modifier when match starts with ^

Dominique Martinet asmadeus at codewreck.org
Tue Dec 21 12:52:29 UTC 2021


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)

Signed-off-by: Dominique Martinet <asmadeus at codewreck.org>
---

stumbled on this because one of my script stripping first/last char in a
single 's/^x\|x$//g' didn't work on alpine with busybox sed.

Thanks!


 editors/sed.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/editors/sed.c b/editors/sed.c
index a6845a979668..e8c82ac63ac4 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)
 		switch (substr[idx]) {
 		/* Replace all occurrences */
 		case 'g':
-			if (match[0] != '^')
-				sed_cmd->which_match = 0;
+			sed_cmd->which_match = 0;
 			break;
 		/* Print pattern space */
 		case 'p':
-- 
2.31.1



More information about the busybox mailing list