
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: