As ferramentas usuais de processamento de texto não são projetadas para lidar com linhas que não se encaixam na RAM. Eles tendem a trabalhar lendo um registro (uma linha), manipulando-o e exibindo o resultado, e então prosseguindo para o próximo registro (linha).
Se houver um caractere ASCII que apareça com frequência no arquivo e não apareça em <unk>
ou <raw_unk>
, você poderá usá-lo como separador de registro. Como a maioria das ferramentas não permite separadores de registros personalizados, troque entre esse caractere e novas linhas. tr
processa bytes, não linhas, por isso não se importa com nenhum tamanho de registro. Supondo que ;
funcione:
<corpus.txt tr '\n;' ';\n' |
sed 's/<unk>/<raw_unk>/g' |
tr '\n;' ';\n' >corpus.txt.new
Você também pode ancorar no primeiro caractere do texto que está pesquisando, supondo que ele não seja repetido no texto de pesquisa e seja exibido com frequência suficiente. Se o arquivo puder começar com unk>
, altere o comando sed para sed '2,$ s/…
para evitar uma correspondência espúria.
<corpus.txt tr '\n<' '<\n' |
sed 's/^unk>/raw_unk>/g' |
tr '\n<' '<\n' >corpus.txt.new
Como alternativa, use o último caractere.
<corpus.txt tr '\n>' '>\n' |
sed 's/<unk$/<raw_unk/g' |
tr '\n>' '>\n' >corpus.txt.new
Observe que essa técnica pressupõe que o sed funcione perfeitamente em um arquivo que não termina com uma nova linha, ou seja, processa a última linha parcial sem truncá-la e sem anexar uma nova linha final. Funciona com o GNU sed. Se você puder escolher o último caractere do arquivo como o separador de registro, você evitará qualquer problema de portabilidade.