On 06/15/11 08:35, Otto Moerbeek wrote: > On Wed, Jun 15, 2011 at 07:44:20AM +0200, Otto Moerbeek wrote: > >> On Tue, Jun 14, 2011 at 11:56:27PM +0200, sven falempin wrote: >> >>> Hello, >>> >>> Indeed there is a small problem: >>> >>> # echo 'abbbbbbbbbbbbbfffff' | sed -E 's/[a$]/x/g' >>> xbbbbbbbbbbbbbfffff >> >> That is expected. $ is only special when it ocurs as the list char of >> a re. >> >>> # echo 'abbbbbbbbbbbbbfffff' | sed -E 's/a|$/x/g' >>> x >> >> This is likely to be a real bug. >> >>> >>> String modification is done inside the 'case 0:' >>> substitute(struct s_command *cp) in src/usr.bin/process.c >>> >>> But the problem may comme from regexec_e. >>> >>> Maybe openbsd devs should test another regexp code version ? >> >> Why? If we should change libs on every bug encountered, nothing will >> be left. >> >> Anyway, thanks for the report. >> >> -Otto >> >>> >>> Hope it helps, >>> Who still use sed anyway :) >>> >>> Regards. >>> >>> 2011/6/12 Ingo Schwarze <[email protected]> >>> >>>> Hi Nils, >>>> >>>> Nils Anspach wrote on Sun, Jun 12, 2011 at 12:49:42PM +0200: >>>> >>>>> I have an issue with sed. Why does >>>>> >>>>> echo 'ab' | sed -E 's/a|$/x/g' >>>>> >>>>> give 'x' whereas >>>> >>>> I sense a bug here. >>>> Tracing a bit around process(), >>>> it looks like the first application of the s command >>>> yields dst = "x" continue_to_process = "b\n", >>>> and then the second application >>>> appends "\n" to dst (should rather append "b", i think). >>>> Maybe something is wrong here with character/pointer counting, >>>> but i'm somewhat out of time now for tracing. >>>> >>>> This is worth more investigation. >>>> >>>> Yours, >>>> Ingo >>>> >>>> >>> >>> >>> -- >>> --------------------------------------------------------------------------------------------------------------------- >>> () ascii ribbon campaign - against html e-mail >>> /\ > > This dif fixes your problem here. Big question is of course: does it > break other cases?
It differs from perl like this: $ echo 'l1_1' | perl -pe 's/1|$/X/g' lX_XX $ echo 'l1_1' | sed -E 's/1|$/X/g' lX_X Meaning we don't hit that final '$' if the last match went to eol. /Alexander

