uutils/sed

`}` not accepted as a command terminator

Open

#392 建立於 2026年4月30日

在 GitHub 查看
 (0 留言) (0 反應) (0 負責人)Rust (23 fork)github user discovery
buggood first issue

倉庫指標

Star
 (91 star)
PR 合併指標
 (平均合併 6天 9小時) (30 天內合併 25 個 PR)

描述

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.

貢獻者指南