
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: