[PATCH 2/2] sed: terminate branch commands at }
Csókás Bence
csokas.bence at prolan.hu
Wed Mar 5 12:57:46 UTC 2025
Hi,
On 2025. 03. 05. 5:38, Jeremy Drake wrote:
> in GNU sed, `echo foo | sed -e '/bar/{b};d'` is valid, but in busybox
> sed would fail with unmatched {.
I beg to differ:
$ echo foo | sed -e 'bar{b};d'
sed: -e expression #1, char 6: unexpected `}'
$ sed --version
sed (GNU sed) 4.8
Packaged by Debian
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[...]
$ echo foo | busybox sed -e 'bar{b};d'
sed: can't find label for jump to 'ar{b}'
$ busybox sed --version
This is not GNU sed version 4.0
$ busybox
BusyBox v1.36.1 (2024-12-20 13:06:58 UTC) multi-call binary.
[...]
> Signed-off-by: Jeremy Drake <busybox at jdrake.com>
> ---
> In strict posix, not even semicolon terminates a label, but busybox seems
> to mostly follow GNU.
>
> I'm not sure about the 'style' of this fix, there might be a more
> idiomatic way to do this.
>
> editors/sed.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/editors/sed.c b/editors/sed.c
> index de411fbf4..6563c270c 100644
> --- a/editors/sed.c
> +++ b/editors/sed.c
> @@ -133,7 +133,7 @@ typedef struct sed_cmd_s {
> char cmd; /* The command char: abcdDgGhHilnNpPqrstwxy:={} */
> } sed_cmd_t;
>
> -static const char semicolon_whitespace[] ALIGN1 = "; \n\r\t\v";
> +#define semicolon_whitespace "; \n\r\t\v"
>
> struct globals {
> /* options */
> @@ -613,7 +613,7 @@ static const char *parse_cmd_args(sed_cmd_t *sed_cmd, const char *cmdstr)
> int length;
>
> cmdstr = skip_whitespace(cmdstr);
> - length = strcspn(cmdstr, semicolon_whitespace);
> + length = strcspn(cmdstr, semicolon_whitespace "}");
I would much rather have a separate `static const char []` for this instead.
Bence
More information about the busybox
mailing list