The standard says: > An editing command with two addresses shall select the inclusive range > from the first pattern space that matches the first address through the > next pattern space that matches the second.
and: > If an RE is empty (that is, no pattern is specified) sed shall behave > as if the last RE used in the last command applied (either as an address > or as part of a substitute command) was specified. https://pubs.opengroup.org/onlinepubs/9799919799/utilities/sed.html With GNU sed (ubuntu 24.04 4.9-2build1): ``` $ seq 1 5 | sed -n '/1/,/3/{//p}' 1 3 $ seq 1 5 | sed -n '/1/,/3/h; //p; d' 1 3 $ seq 31 35 | sed -n '/1/,/3/{//p}' 31 32 $ seq 31 35 | sed -n '/1/,/3/h; //p; d' 31 32 ``` but with busybox sed (ubuntu 24.04 1:1.36.1-6ubuntu3.1): ``` $ seq 1 5 | busybox sed -n '/1/,/3/{//p}' 3 $ seq 1 5 | busybox sed -n '/1/,/3/h; //p; d' 3 $ seq 31 35 | busybox sed -n '/1/,/3/{//p}' 31 32 $ seq 31 35 | busybox sed -n '/1/,/3/h; //p; d' 31 32 33 34 35 ``` A barebones busybox compiled from 1_37_0 distribution tarball gives me the same result. "last command" seems incompletely defined by the standard. Which iteration of the range should `{//p}` refer to? Tests 2 and 4 sidestep this ambiguity by moving the // outside the range command. I would expect the 2nd test to: * check line 1 for /1/ - "1" matches, so // succeeds * check line 2 for /3/ - "2" fails, so // fails * check line 3 for /3/ - "3" matches, so // succeeds * check line 4 for /1/ - "4" fails, so // fails * check line 5 for /1/ - "5" fails, so // fails I would expect the 4th test to: * check line 1 for /1/ - "31" matches, so // succeeds * check line 2 for /3/ - "32" matches, so // succeeds * check line 3 for /1/ - "33" fails, so // fails * check line 4 for /1/ - "34" fails, so // fails * check line 5 for /1/ - "35" fails, so // fails -jonathan _______________________________________________ busybox mailing list [email protected] https://lists.busybox.net/mailman/listinfo/busybox
