start=3; # these can only be positive integers
stop=4; # stop > start
perl -lne "// or print if /Pattern/ && ++\$a == $start ... // && ++\$a == $stop" data.in
Perl-решение использует оператор диапазона ...
, где два операнда действуют как триггеры: => пока первый операнд ложен, ... возвращает ложный. Как только первый операнд становится истинным, ... возвращает истину. Он станет ложным только тогда, когда второй операнд станет истинным. Тонкость возникает из-за того, что операнд1 не оценивается, как только он становится истинным, и операнд2 не оценивается, пока операнд1 является ложным.
sed -nE "
/Pattern/!d
x
s/\$/./
/^[.]{$start}\$/!{x;d;}
x
n
:loop
p;n
/Pattern/{
x
s/\$/./
/^.{$stop}\$/q
x
}
bloop
" data.in
Решение sed использует пространство хранения для подсчета количества просмотров шаблона. Мы продолжаем отклонять строки до тех пор, пока не будет обнаружено $start количество шаблонов. Как только приходит шаблон $start-th, мы запускаем цикл, который продолжает читать следующую строку, выводить ее и все время измерять, виден ли шаблон $stop-th. Однажды увидев, мы быстро уходим.