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 (f36635cec6) 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>
			
			
This commit is contained in:
		
				
					committed by
					
						 Denys Vlasenko
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							a05a3d5932
						
					
				
				
					commit
					4fe954c148
				
			| @@ -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': | ||||
|   | ||||
| @@ -399,6 +399,12 @@ testing "sed uses previous regexp" \ | ||||
| 	"" \ | ||||
| 	"q\nw\ne\nr\n" | ||||
|  | ||||
| testing "sed ^ OR not^" \ | ||||
| 	"sed -e 's/^a\|b//g'" \ | ||||
| 	"ca\n" \ | ||||
| 	"" \ | ||||
| 	"abca\n" | ||||
|  | ||||
| # testing "description" "commands" "result" "infile" "stdin" | ||||
|  | ||||
| exit $FAILCOUNT | ||||
|   | ||||
		Reference in New Issue
	
	Block a user