diff options
author | Denys Vlasenko | 2022-01-23 19:04:27 +0100 |
---|---|---|
committer | Denys Vlasenko | 2022-01-23 19:04:27 +0100 |
commit | f12fb1e4092900f26f7f8c71cde44b1cd7d26439 (patch) | |
tree | b5dec7c96074267b6d299928481e649e75c00885 | |
parent | e998c7c032458a05a7afcc13ce0dc980b99ecc6c (diff) | |
download | busybox-f12fb1e4092900f26f7f8c71cde44b1cd7d26439.zip busybox-f12fb1e4092900f26f7f8c71cde44b1cd7d26439.tar.gz |
sed: fix handling of escaped delimiters in s/// replacement
function old new delta
parse_regex_delim 111 140 +29
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/sed.c | 5 | ||||
-rwxr-xr-x | testsuite/sed.tests | 9 |
2 files changed, 11 insertions, 3 deletions
diff --git a/editors/sed.c b/editors/sed.c index 02a527b..32a4b61 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -355,7 +355,10 @@ static int parse_regex_delim(const char *cmdstr, char **match, char **replace) /* save the replacement string */ cmdstr_ptr += idx + 1; idx = index_of_next_unescaped_regexp_delim(- (int)delimiter, cmdstr_ptr); - *replace = copy_parsing_escapes(cmdstr_ptr, idx, 0); +//GNU sed 4.8: +// echo 789 | sed 's&8&\&&' - 7&9 ("\&" remained "\&") +// echo 789 | sed 's1\(8\)1\1\11' - 7119 ("\1\1" become "11") + *replace = copy_parsing_escapes(cmdstr_ptr, idx, delimiter != '&' ? delimiter : 0); return ((cmdstr_ptr - cmdstr) + idx); } diff --git a/testsuite/sed.tests b/testsuite/sed.tests index 440996a..626542e 100755 --- a/testsuite/sed.tests +++ b/testsuite/sed.tests @@ -329,10 +329,15 @@ testing "sed special char as s/// delimiter, in pattern" \ "sed 's+9\++X+'" \ "X8=17\n" "" "9+8=17\n" -# but in replacement string, "\&" remains "\&", not interpreted as "&" -testing "sed special char as s/// delimiter, in replacement" \ +# Matching GNU sed 4.8: +# in replacement string, "\&" remains "\&", not interpreted as "&" +testing "sed special char as s/// delimiter, in replacement 1" \ "sed 's&9&X\&&'" \ "X&+8=17\n" "" "9+8=17\n" +# in replacement string, "\1" is interpreted as "1" +testing "sed special char as s/// delimiter, in replacement 2" \ + "sed 's1\(9\)1X\11'" \ + "X1+8=17\n" "" "9+8=17\n" testing "sed /\$_in_regex/ should not match newlines, only end-of-line" \ "sed ': testcont; /\\\\$/{ =; N; b testcont }'" \ |