¿Usar sed, o qué, para hacer coincidir y eliminar varias líneas, es decir, "Directorio" seguido de dos líneas en blanco?

¿Usar sed, o qué, para hacer coincidir y eliminar varias líneas, es decir, "Directorio" seguido de dos líneas en blanco?

Tengo un archivo que enumera todos los directorios de un disco duro. Quiero eliminar todas las instancias de una línea con la palabra "Directorio" seguida de dos líneas en blanco. Es decir, quiero eliminar esas tres líneas cada vez que ocurre la secuencia.

Ya eliminé todas las líneas con "<DIR> .", "<DIR> .."y "0 Files", pero todavía quedan algunas cosas sobrantes.

La tarea original era eliminar cada secuencia de 6 líneas con el siguiente patrón:

Directory of m:\Winter Interludes

12/20/2020  10:24 PM    DIR          .
12/20/2010  10:24 PM    DIR          ..
               0 File(s)              0 bytes

Respuesta1

perla:

sorber el archivo completo en una matriz

Bucle sobre el índice de la matriz

si no hay banderas establecidas y aparece la primera coincidencia, establezca una bandera

Si la bandera y la segunda línea coinciden, establezca otra bandera.

Si tanto la bandera como la tercera línea coinciden, elimine las tres líneas de la matriz.

Finalizar bucle

Volver a imprimir la matriz modificada

También debería funcionar en Python.

--

Si desea utilizar una única expresión regular para hacer coincidir varias líneas, Perl tiene un indicador post-regex "m" para eso. De perlre:

m Trate la cadena como líneas múltiples. Es decir, cambie ^'' and$'' para que no coincida solo al principio o al final de la cadena al inicio o al final de cualquier línea en cualquier lugar dentro de la cadena,

s Trate la cadena como una sola línea. Es decir, cambie .'' to match any character whatsoever, even a newline, which it normally would not match. The /s and /m modifiers both override the $* setting. That is, no matter what $* contains, /s without /m will force ^'' para que coincida solo con el comienzo de la cadena y $'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.'' que coincida con cualquier carácter, al tiempo que permite que ^'' and$'' coincida, respectivamente, justo después y justo antes de las nuevas líneas dentro de la cadena.

Respuesta2

perl -0777 -p -e 's/[^\n]*Directorio[^\n]*\n\n\n//sg' entrada

Respuesta3

En vim, podrías usar: :%s:Directory{ctrl+v, return}{ctrl+v}return:

información relacionada