awk
Soluções simples :
Suponha que a expressão regular a ser usada para encontrar linhas correspondentes seja armazenada na variável shell $regex
e a contagem de linhas a serem puladas $count
.
Se a linha correspondente também deve ser ignorada (as $count + 1
linhas são ignoradas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Se a linha correspondente deveria não ser pulada ($count
linhas após a correspondência são puladas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Explicação:
-v regex="$regex" -v count="$count"
define awk
variáveis com base em variáveis de shell de mesmo nome.
$0 ~ regex
corresponde à linha de interesse
{ skip=count; next }
inicializa a contagem de pulados e prossegue para a próxima linha, pulando efetivamente a linha correspondente; na 2ª solução, oprint
antes next
garante que é não ignorado.
--skip >= 0
diminui a contagem de saltos e executa uma ação se (ainda)> = 0, o que implica que a linha em questão deve ser saltada.
{ next }
prossegue para a próxima linha, efetivamente pulando a linha atual
1
é uma abreviação comumente usada para { print }
; ou seja, a linha atual é simplesmente impressa
- Somente linhas não correspondentes e não puladas alcançam este comando.
- A razão de que
1
é equivalente a { print }
é que 1
é interpretado como um padrão booleano que por definição sempre avalia como verdadeiro, o que significa que sua ação associada (bloco) é executada incondicionalmente. Como não há nenhuma ação associada neste caso, o awk
padrão é imprimir a linha.
+N
padrão é uma extensão GNU. Mude o primeiron
para umN
em seu segundo exemplo para fazê-lo incluir a linha com o padrão.