Use sed - ou o quê - para combinar e excluir várias linhas, ou seja, "Diretório" seguido por duas linhas em branco?

Use sed - ou o quê - para combinar e excluir várias linhas, ou seja, "Diretório" seguido por duas linhas em branco?

Eu tenho um arquivo listando todos os diretórios em um disco rígido. Quero excluir todas as instâncias de uma linha com a palavra "Diretório" seguida de duas linhas em branco. Ou seja, quero excluir todas essas três linhas sempre que a sequência ocorrer.

Já apaguei todas as linhas com "<DIR> .", "<DIR> ..", e "0 Files"-- mas ainda há algumas sobras.

A tarefa original era excluir cada sequência de 6 linhas com o seguinte padrão:

Directory of m:\Winter Interludes

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

Responder1

perl:

sorver o arquivo inteiro em array

Loop sobre o índice da matriz

se nenhum sinalizador for definido e a primeira correspondência aparecer, defina um sinalizador

se o sinalizador e a segunda linha corresponderem, defina outro sinalizador

se o sinalizador e a terceira linha corresponderem, exclua as três linhas da matriz

Fim do ciclo

Imprimir array modificado de volta

também deve funcionar em python

--

Se você quiser usar um único regexp para corresponder a várias linhas, o Perl possui um sinalizador pós-regex "m" para isso. De perlre:

m Trate a string como múltiplas linhas. Ou seja, altere ^'' and$'' de correspondência apenas no início ou no final da string para o início ou final de qualquer linha em qualquer lugar da string,

s Trate a string como uma única linha. Ou seja, altere .'' 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 corresponder apenas ao início da string e $'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.'' corresponda a qualquer caractere, permitindo ainda que ^'' and$'' corresponda, respectivamente, logo após e antes das novas linhas na string.

Responder2

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

Responder3

No vim, você poderia usar: :%s:Directory{ctrl+v, return}{ctrl+v}return:

informação relacionada