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:
-v f=1
Cree una variable awk
f
y configúrela en1
./world/{f=0}
Si la línea actual contiene
world
, establezca la variablef
en cero./Activity|task/{f=1}
Si la línea contiene
Activity
otask
, configúrelof
en1
.Tenga en cuenta que
world
lo anterior yActivity
/otask
aquí se tratan como expresiones regulares. Además, distinguen entre mayúsculas y minúsculas.f
Si
f
es 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 f
no 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 :)