I noticed something odd while fooling around with sed. If you try to remove multiple line intervals (by number) from a file, but any interval specified later in the list is a subset of an interval earlier in the list, then an additional single line is removed after the specified (larger) interval.
seq 10 > foo.txt
sed '2,7d;3,6d' foo.txt
1
9
10
Expected output is:
1
8
9
10
Additional tests:
For each additional redundant interval, another line is removed:
sed '2,7d;3,6d;4,5d' foo.txt
1
10
Reversing the order of the intervals produces the expected result!
sed '3,6d;2,7d' foo.txt
1
8
9
10
Specifying the intervals with '-e' produces the same result:
sed -e '2,7d' -e '3,6d' foo.txt
1
9
10
Using different interval syntax has mixed results:
sed -e '/2/,/7/d' -e '/3/,/6/d' foo.txt
1
8
9
10
sed -e '2,7d' -e '/3/,/6/d' foo.txt
1
8
9
10
sed -e '/2/,/7/d' -e '3,6d' foo.txt
1
9
10
Trailing list must be a subset for the additional line to be removed:
sed '2,5d;1,5d'
1
8
9
10
sed '2,5d;2,6d'
1
8
9
10
sed '2,5d;2,5d'
1
9
10
Versions:
Breakage appears to have occurred in the 4.1 release. See the expected output for all cases in GNU sed 3.02 and 4.09 (as well as BSD sed (Mac OS X 10.2 Yosemite and /bin/sed on Solaris), but not in 4.15 and 4.21
.