Comando básico sed em um arquivo grande de uma linha: não foi possível realocar a memória

7

Eu tenho um arquivo de texto de 250 MB, tudo em uma linha.

Neste arquivo, quero substituir a caracteres por b caracteres:

sed -e "s/a/b/g" < one-line-250-mb.txt

Falha com:

sed: couldn't re-allocate memory

Parece-me que esse tipo de tarefa poderia ser executada em linha sem alocar muita memória.
Existe uma ferramenta melhor para o trabalho ou uma maneira melhor de usar sed ?

Versão do GNU sed 4.2.1
Ubuntu 12.04.2 LTS
1 GB de RAM

    
por Nicolas Raoul 19.12.2013 / 04:31

2 respostas

9

Sim, use tr :

tr 'a' 'b' < file.txt > output.txt

sed lida em linhas, portanto, uma linha enorme causará problemas. Espero que esteja declarando uma variável internamente para manter a linha e sua entrada exceda o tamanho máximo alocado para essa variável.

Por outro lado,

tr lida com caracteres e deve ser capaz de manipular corretamente linhas longas arbitrariamente.

    
por 19.12.2013 / 04:40
3

Versões históricas de sed e awk tiveram problemas de memória, estas foram corrigidas principalmente em versões mais recentes, mas uma das ocorrências clássicas deste problema ocorreu Larry Wall muito difícil. Sua resposta foi escrever uma nova linguagem de programação - sem limites de memória além do hardware. Ele chamou isso de perl. seu problema específico pode ser resolvido de forma mais simples, mas a regra geral que uso é quando sed não usa perl.

Editar: solicite um exemplo:

perl -pe "s/a/b/g" < one-line-250-mb.txt

ou por menos uso de memória:

perl -e 'BEGIN{$/=768}' -pe "s/a/b/g" < one-line-250-mb.txt
    
por 19.12.2013 / 05:51