Várias ações de busca e substituição em um arquivo de texto grande

8

Eu tenho um grande arquivo de texto (cerca de 2 GB). Eu quero fazer cinco ações de pesquisa e substituição no mesmo arquivo e gostaria de fazer isso em um comando. Normalmente eu uso o vim, abro o arquivo, faço uma ação de substituição, depois a próxima, etc. Há um problema, pois notei que após três ou quatro pesquisas o vim falha por causa de problemas de memória.

Aqui estão dois exemplos do comando que eu uso no Vim:

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

Qual é a melhor maneira de lidar com isso?

    
por SPRBRN 11.07.2013 / 13:52

2 respostas

7

Eu usaria sed assim:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt
A opção

-i significa substituição "no local". Você pode dizer ao sed para criar um backup do seu arquivo fornecendo uma extensão para esta opção ( -i.bak irá fazer backup de seu arquivo.txt como seu arquivo.txt.bak).

    
por 11.07.2013 / 14:06
5

Se você tiver muitos mais padrões de pesquisa, poderá salvá-los em um arquivo e ler as substituições a partir dele. Por exemplo, digamos que estes sejam os conteúdos de replacements.txt :

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

Você pode então ler uma lista de N substituições e substituí-las por:

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

NOTAS:

  • Isso pressupõe que as strings de pesquisa não contenham espaços e que quaisquer caracteres estranhos precisem ser escapados em replacements.txt .
  • Ele executará um sed por substituição, o que poderá demorar um pouco se você tiver muitas operações de substituição.
  • Ele pode lidar com um número arbitrário de substituições (milhares ou milhões ou qualquer outra coisa), desde que você não se importe que leve um pouco mais de tempo.

Outra opção seria escrever o acima como um script sed :

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

Você pode então executar o script no seu arquivo e ele fará todas as substituições de uma só vez:

sed -f replace.sed infile.txt 
    
por 11.07.2013 / 15:16