eliminación selectiva de líneas entre dos patrones

eliminación selectiva de líneas entre dos patrones

Tengo un archivo que contiene el siguiente contenido,

Hello world Unix!!
Its bright world
Current time is HH:mm:ss
Next action plan is item #3
End of task.
Thank you.


Hello world Linux!!
All actions completed.
End of Activity.
Thanks.

Me gustaría eliminar selectivamente todas las líneas que contienen la palabra clave "mundo" y también todas las líneas posteriores hasta que se encuentre una línea con un conjunto específico de palabras clave (Ejemplo, "Actividad" o "tarea").

Salida deseada :

End of task.
Thank you.
End of Activity.
Thanks. 

Respuesta1

Intentar:

$ awk  -v f=1 '/world/{f=0} /Activity|task/{f=1} f' File
End of task.
Thank you.


End of Activity.
Thanks.

Cómo funciona:

  1. -v f=1

    Cree una variable awk fy configúrela en 1.

  2. /world/{f=0}

    Si la línea actual contiene world, establezca la variable fen cero.

  3. /Activity|task/{f=1}

    Si la línea contiene Activityo task, configúrelo fen 1.

    Tenga en cuenta que worldlo anterior y Activity/o taskaquí se tratan como expresiones regulares. Además, distinguen entre mayúsculas y minúsculas.

  4. f

    Si fes distinto de cero, imprima la línea.

Para eliminar también líneas en blanco

$ awk  -v f=1 '/world/{f=0} /Activity|task/{f=1} f && /./' File
End of task.
Thank you.
End of Activity.
Thanks.

f && /./le dice a awk que imprima la línea solo si fno es ceroyla línea contiene al menos un carácter (de cualquier tipo).

Respuesta2

No es tan bonito como la solución awk, pero dado que el OP etiquetó la pregunta consedademas aqui va:

#with blank lines
sed '/world/,/task\|Activity/{//!d};/world/d' file

#without blank lines
sed '/world/,/task\|Activity/{//!d};/world\|^$/d' file

Tenga en cuenta el uso de //, que significa que se utilizó la expresión regular anterior :)

información relacionada