uutils/sed

`}` not accepted as a command terminator

Open

#392 geöffnet am 30. Apr. 2026

Auf GitHub ansehen
 (0 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)Rust (23 Forks)github user discovery
buggood first issue

Repository-Metriken

Stars
 (91 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 9h) (25 gemergte PRs in 30 T)

Beschreibung

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.

Contributor Guide