Existem linhas específicas que desejo remover de um arquivo. Digamos que seja a linha 20-37 e depois a linha 45. Como eu faria isso sem especificar o conteúdo dessas linhas?
text-processing
tshepang
fonte
fonte
Respostas:
Com
sed
, assim:Se você quiser fazer isso no local:
fonte
ed
, ou GNU sed-i
, ousponge
, ou um método de arquivo grande .This option specifies that files are to be edited in-place. GNU
sed 'faz isso criando um arquivo temporário e enviando a saída para esse arquivo e não para a saída padrão.` ... Eu não conheço nenhum outro 'sed', mas a logística da atualização "no local" com um editor de fluxo não "calcula" :)Se o arquivo couber confortavelmente na memória, você também pode usá-lo
ed
.Os comandos são bem parecidos com o
sed
acima, com uma diferença notável : você precisa passar a lista de números de linhas / faixas a serem excluídas em ordem decrescente (da linha mais alta sem / faixa para a mais baixa). O motivo é que, quando você exclui / insere / divide / une linhased
, o buffer de texto é atualizado após cada subcomando, portanto, se você excluir algumas linhas, o restante das linhas a seguir não estará mais na mesma posição no buffer quando o o próximo subcomando é executado. Então você tem que começar de trás para frente 1 . Edição nolocal :
ou
ou
Substitua
w
rite por,p
rint se desejar imprimir a saída resultante em vez de gravar no arquivo. Se você deseja manter intacto o arquivo original e gravar em outro arquivo, pode passar o novo nome do arquivo para ow
subcomando rite:1 A menos que você esteja disposto a calcular os novos números de linha após cada
d
exclusão, o que é bastante trivial para este caso em particular (após excluir as linhas 20-37, ou seja, 18 linhas, a linha 45 se torna a linha 27) para que você possa executar:No entanto, se você precisar excluir vários números / faixas de linha, trabalhar para trás não é um acéfalo.
fonte
q
comando é útil no final? Eu acho que sai de qualquer maneira.Apenas leia na memória, altere e depois escreva de volta. Você pode fazer algo como
Testado com um arquivo de 5 linhas. Créditos para http://pleac.sourceforge.net/pleac_python/fileaccess.html , consulte a seção "Modificando um arquivo no local sem um arquivo temporário". Consulte também https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python
Algumas notas:
Pode-se primeiro truncar o arquivo, depois escrever nele, em vez de escrever e depois truncar, como acima. No entanto, não conheço um sinalizador Python que permita a leitura e, em seguida, faça uma gravação truncada. Mas talvez esteja faltando alguma coisa, pois o documento não está tão claro. O que me leva a
Às vezes, a documentação do Python é realmente péssima. Consulte http://docs.python.org/library/functions.html#open
Isso significa alguma coisa para você? O que diabos está "aberto para atualização"?
Eu não sei se fazer isso em python em vez de algo unixy como o editor de fluxo é melhor. Pode ser mais portátil, mas não sei como o sed é portátil. Eu escrevi assim porque me sinto mais à vontade com a programação de baixo nível do que com as ferramentas clássicas do Unix, que são boas se elas fazem exatamente o que você deseja, mas (eu acho) geralmente são menos flexíveis.
Essa abordagem (manipular o arquivo na memória) troca a memória por espaço em disco. Ele deve funcionar bem em máquinas com alguns Gb de memória para arquivos de até algumas centenas de Mb. O Python não lida com seqüências de caracteres com muita eficiência, portanto, mudar para C / C ++, por exemplo, aumentaria um pouco o desempenho e reduziria bastante o uso de memória.
fonte
Você pode usar o Vim no modo Ex:
d
excluirx
salvar e fecharfonte