[Bug 284434] ed(1) special replacement with "%" doesn't quite match with man-page
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 284434] ed(1) special replacement with "%" doesn't quite match with man-page"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 284434] ed(1) special replacement with "%" doesn't quite match with man-page"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 284434] ed(1) special replacement with "%" doesn't quite match with man-page"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 284434] ed(1) special replacement with "%" doesn't quite match with man-page"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 29 Jan 2025 14:40:01 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=284434 Bug ID: 284434 Summary: ed(1) special replacement with "%" doesn't quite match with man-page Product: Base System Version: Unspecified Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: misc Assignee: bugs@FreeBSD.org Reporter: freebsd@tim.thechases.com From `man ed` > If replacement consists of a single `%', then replacement from the last substitution is used However, there seems to be a bug in this if the closing delimiter isn't provided. Normally the closing replacement delimiter is optional: s/foo/bar/ s/foo/bar (both replace "foo" with "bar") However using "%" per the man-page seems to require the closing delimiter. To demonstrate $ cat test.txt a b c $ ed test.txt 6 1s/a/hello hello 2/s/b/% % ,n 1 hello 2 % 3 c Q $ ed test.txt 6 1s/a/hello hello 2/s/b/%/ ,n 1 hello 2 hello 3 c Q So the biggest issue is that, without the trailing slash, it replaces with "%" rather than the last replacement text. As a minor side-note, when using the most recent replacement (with the slash), it doesn't print the resulting line the same way it does with a normal substitution (i.e., note that the first example prints the "%", while the second emits nothing) It looks like src/bin/ed/sub.c:77 has the test if (*ibufp == '%' && *(ibufp + 1) == delimiter) { which should likely be something like (untested) if (*ibufp == '%' && (*(ibufp + 1) == delimiter || *(ibufp + 1) == '\0')) { -- You are receiving this mail because: You are the assignee for the bug.