uutils/sed

`}` not accepted as a command terminator

Open

#392 aberto em 30 de abr. de 2026

Ver no GitHub
 (0 comments) (0 reactions) (0 assignees)Rust (23 forks)github user discovery
buggood first issue

Métricas do repositório

Stars
 (91 stars)
Métricas de merge de PR
 (Mesclagem média 6d 9h) (25 fundiu PRs em 30d)

Description

Bug

A closing brace } is not accepted as a command terminator. Idioms like {p}, 1{p}, /re/{p} fail because the parser only accepts ; or end-of-line after a command.

Reproduction

$ echo a | ./target/release/sed '{p}'
sed: <script argument 1>:1:3: error: extra characters at the end of the p command

$ echo a | ./target/release/sed '{p;}'   # workaround: trailing semicolon
a
a

GNU sed 4.9:

$ echo a | /usr/bin/sed '{p}'
a
a

Suspected fix

src/sed/compiler.rs:514parse_command_ending:

fn parse_command_ending(
    lines: &ScriptLineProvider,
    line: &mut ScriptCharProvider,
    cmd: &mut Command,
) -> UResult<()> {
    if !line.eol() && line.current() == ';' {
        line.advance();
        return Ok(());
    }

    if !line.eol() {
        return compilation_error( … "extra characters at the end of … command" );
    }
    Ok(())
}

Add a third accepted terminator: }. Crucially, do not advance past it — leave it in the stream so that the outer loop's compile_end_group_command (line 1300) can consume it as the block close. Something like:

if !line.eol() && line.current() == '}' {
    return Ok(());
}

before the existing extra characters error.

Affected GNU testsuite tests

compile-tests, compile-errors, and incidental in many others that use {cmd} blocks.

Guia do colaborador