Eu tenho uma série muito longa de URLs sem caractere separador, no mesmo formato abaixo:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Quero que cada URL esteja em uma nova linha. Tentei fazer isso substituindo todas as instâncias de "http: //" por "\ nhttp: //" usando sed
sed 's_http://_\nhttp://_g' urls.txt
mas ocorre uma falha de segmentação (violação de memória). Só posso supor que o tamanho do arquivo (mais de 100 GB) está causando o sed exceder algum limite.
Eu poderia dividir o arquivo em vários arquivos menores para processamento, mas todas as instâncias de "http: //" precisariam ser mantidas intactas.
Existe uma maneira melhor de fazer isso?
text-processing
sed
C Sawyer
fonte
fonte
Respostas:
Com
awk
você, você pode evitar a leitura de uma grande quantidade de texto de uma só vez:O sucesso pode depender da
awk
implementação usada . Por exemplo,gawk
funciona bem, masmawk
trava.fonte
Isso fará o trabalho:
Ao definir $ / , alterei a definição de uma linha para que termine com, em
//
vez de uma nova linha. Isso faz com que o Perl leia um URL de cada vez. É improvável que um URL contenha,//
exceto após o esquema, mas tudo bem, se houver, o regex evitará a adição de novas linhas falsas.Se você deseja evitar adicionar uma linha em branco antes do primeiro URL:
Você pode tentar fazer comparações para ver se
s!http://\z!\nhttp://!
é mais rápido. Eles são equivalentes. Observe que a/g
bandeira não é necessária na substituição, porque só pode haver uma correspondência por "linha".fonte
$/
, ele lidará apenas com um URL de cada vez.man perlvar
, mas faz sentido assim.http:
parte da regex. Ele examinará todos//
, mas não adicionará uma nova linha, a menos que encontrehttp://
.:
com uma nova linha para dividir o arquivo.http
no final da linha comhttp:
e acrescente a próxima linhaEssas etapas são parecidas com:
Verifique se há linhas que não começam
http://
, imprima os números das linhas. Isso ocorreria apenas se a: estivesse em algum lugar da URL que não fosse depois dahttp
.grep -nv '^http://'
fonte