Saltar al contenido

sed o awk: elimina n líneas siguiendo un patrón

Después de consultar con expertos en el tema, programadores de diversas ramas y profesores hemos dado con la solución a la pregunta y la dejamos plasmada en esta publicación.

Solución:

Voy a intentarlo.

Para eliminar 5 líneas después de un patrón (incluida la línea con el patrón):

sed -e '/pattern/,+5d' file.txt

Para borrar 5 líneas después de un patrón (excluyendo la línea con el patrón):

sed -e '/pattern/n;N;N;N;N;d' file.txt

Sin extensiones GNU (por ejemplo, en macOS):

Para eliminar 5 líneas después de un patrón (incluida la línea con el patrón)

 sed -e '/pattern/N;N;N;N;d;'

Agregar -i '' para editar en el lugar.

Sencillo awk soluciones:

Suponga que la expresión regular a usar para encontrar líneas coincidentes se almacena en la variable de shell $regexy el conteo de líneas para saltar $count.

Si el línea coincidente debe además ser salteado ($count + 1 se saltan líneas):

... | awk -v regex="$regex" -v count="$count" 
  '$0 ~ regex  skip=count; next  --skip >= 0  next  1'

Si el línea coincidente debe no ser salteado ($count líneas después el partido se salta):

... | 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 cascarón variables del mismo nombre.
  • $0 ~ regex coincide con la línea de interés
    • skip=count; next inicializa el conteo de saltos y pasa a la siguiente línea, omitiendo efectivamente la línea coincidente; en la segunda solución, el print antes de next asegura que es no saltado
    • --skip >= 0 disminuye el conteo de saltos y toma medidas si (todavía) es >= 0, lo que implica que la línea en cuestión debe omitirse.
    • next pasa a la siguiente línea, omitiendo 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 y que no se saltan llegan a este comando.
    • La razón que 1 es equivalente a print es eso 1 se interpreta como un patrón booleano que, por definición, siempre se evalúa como true, lo que significa que su acción asociada (bloque) se ejecuta incondicionalmente. ya que hay no acción asociada en este caso, awk por defecto a impresión la línea.

Sección de Reseñas y Valoraciones

Finalizando este artículo puedes encontrar las críticas de otros programadores, tú también tienes la libertad de mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *