awk
Soluciones sencillas :
Suponga que la expresión regular que se utilizará para encontrar líneas coincidentes se almacena en la variable de shell $regex
y el recuento de líneas para saltar $count
.
Si también se debe omitir la línea coincidente ( $count + 1
se omiten las líneas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Si la línea coincidente no debe omitirse (se omiten las$count
líneas posteriores a la coincidencia):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Explicación:
-v regex="$regex" -v count="$count"
define awk
variables basadas en variables de shell del mismo nombre.
$0 ~ regex
coincide con la línea de interés
{ skip=count; next }
inicializa el recuento de saltos y pasa a la siguiente línea, saltando efectivamente la línea correspondiente; en la segunda solución, los print
antes next
asegura que es no saltarse.
--skip >= 0
disminuye el número de saltos y actúa si es (todavía)> = 0, lo que implica que la línea en cuestión debe omitirse.
{ next }
pasa a la siguiente línea, saltándose efectivamente la línea actual
1
es una abreviatura de uso común para { print }
; es decir, la línea actual simplemente se imprime
- Solo las líneas que no coinciden ni se omiten llegan a este comando.
- La razón por la que
1
es equivalente a { print }
es que 1
se interpreta como un patrón booleano que por definición siempre se evalúa como verdadero, lo que significa que su acción asociada (bloque) se ejecuta incondicionalmente. Dado que no hay ninguna acción asociada en este caso, el valor awk
predeterminado es imprimir la línea.
+N
patrón es una extensión GNU. Cambie el primeron
a anN
en su segundo ejemplo para que incluya la línea con el patrón.