Aqui está uma maneira com awk
:
awk -vN=85 -vM=5 'BEGIN{c=0}
/PATTERN/{c++
{if (c==N) {l=NR;last=NR+M}}
}{if (NR<=last && NR>=l) print}' infile
Onde N
é o N th linha correspondendo PATTERN
e M
é o número de linhas que seguem. Ele define um contador e quando a correspondência da linha N é encontrada, salva o número da linha. Em seguida, imprime as linhas do atual NR
até NR
+ M .
Para registro, é assim que você faz isso com sed
( gnu sed
syntax):
sed -nE '/PATTERN/{x;/\n{84}/{x;$!N;$!N;$!N;$!N;$!N;p;q};s/.*/&\n/;x}' infile
Isso está usando o espaço de espera para contar.
Sempre que encontrar uma linha correspondente a PATTERN
it e x
altera os buffers e verifica se há ocorrências N-1 do caractere \n
ewline no buffer de retenção. Se a verificação for bem-sucedida, e x
mudará novamente, puxará as próximas linhas M com o comando $!N
e p
rints o espaço padrão, em seguida q
uits.
Caso contrário, ele adiciona apenas outro caractere \n
ewline ao espaço de espera e e x
é alterado novamente.
Esta solução é menos conveniente, pois rapidamente se torna incômoda quando M é um grande número e requer que alguns printf
-fu construam um script sed
(sem mencionar o padrão e manter os limites de espaço com alguns sed
s).