On Sun, Aug 15, 2021 at 09:52:57PM +0200, Martijn van Duren wrote:
> On Sat, 2021-08-14 at 20:20 +0200, Andreas Kusalananda Kähäri wrote:
> > On Fri, Aug 13, 2021 at 11:19:16PM +0800, Philippe Meunier wrote:
> > > Hello,
> > >
> > > While porting a shell script from Linux to OpenBSD I came across the
> > > following:
> > [cut]
> > > 2) Out of curiosity, is there an OpenBSD equivalent to GNU's
> > > '0,/^test$/d' ?
> >
> > As far as I can see, the following would work the same as GNU's
> > '0,/^test$/d':
> >
> > sed -e '1 { /^test$/d; }' -e '1,/^test$/d' file
> >
> > That is, delete the first line if it is "test", otherwise delete from
> > line 1 the next line that is "test".
> >
> This behaviour should not be relied upon for portable scripts, since
> addresses in combination with "next cycle" are heavily underspecified
> and at least doesn't match gsed's behaviour:
Lucky me that what was being sought was an expression that worked with
the OpenBSD sed implementation. Interestingly, it also works with the
Plan 9 sed. It doesn't make it more correct, that's true, but it makes
GNU sed the odd one out.
> $ printf 'test1\nbla1\ntest2\nbla2\n' | gsed -e '1 { /^test/d; }' -e
> '1,/^test/d'
> bla2
>
> Right now, I can't for the life of me think of a shorter way to do this
> portably, but the code below works in both sed and gsed.
> $ printf 'bla0\ntest1\nbla1\ntest2\nbla2\n' | sed
> '1{/^test/{h;d;};};1,/^test/{x;/^$/{x;d;};x;}'
> bla1
> test2
> bla2
> $ printf 'bla0\ntest1\nbla1\ntest2\nbla2\n' | gsed
> '1{/^test/{h;d;};};1,/^test/{x;/^$/{x;d;};x;}'
> bla1
> test2
> bla2
> $ printf 'test1\nbla1\ntest2\nbla2\n' | sed
> '1{/^test/{h;d;};};1,/^test/{x;/^$/{x;d;};x;}'
> bla1
> test2
> bla2
> $ printf 'test1\nbla1\ntest2\nbla2\n' | gsed
> '1{/^test/{h;d;};};1,/^test/{x;/^$/{x;d;};x;}'
> bla1
> test2
> bla2
> If you need this snippet in a larger script that needs the holdspace,
> make sure that you clean the holdspace before continuing.
>
> martijn@
--
Andreas (Kusalananda) Kähäri
SciLifeLab, NBIS, ICM
Uppsala University, Sweden
.