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

2

Eu tenho um arquivo listando todos os diretórios em um disco rígido. Eu quero excluir todas as instâncias de uma linha com a palavra "Diretório", seguido por duas linhas em branco. Ou seja, quero excluir todas as três dessas 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
    
por Jeff Atwood 09.04.2011 / 05:08

3 respostas

2

perl:

adicione um arquivo inteiro na matriz

Índice de array sobre loop

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

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

se ambas as correspondências bandeira e terceira linha excluírem as três linhas da matriz

Finalizar Loop

Imprimir matriz modificada de volta

também deve funcionar em python

-

Se você quiser usar um único regexp para combinar em várias linhas, o perl tem um sinalizador "m" pós-regex para isso. De perlre:

m Treat string as multiple lines. That is, change ^'' and$'' from matching at only the very start or end of the string to the start or end of any line anywhere within the string,

s Treat string as single line. That is, change .'' 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 ^'' to match only at the beginning of the string and $'' to match only at the end (or just before a newline at the end) of the string. Together, as /ms, they let the.'' match any character whatsoever, while yet allowing ^'' and$'' to match, respectively, just after and just before newlines within the string.

    
por 09.04.2011 / 05:40
2
perl -0777 -p -e 's/[^\n]*Directory[^\n]*\n\n\n//sg' input
    
por 09.04.2011 / 14:38
1

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

    
por 09.04.2011 / 05:39

Tags