Encontre palavras repetidas em um texto

5

Um dos erros mais comuns é repetir a mesma palavra duas vezes, como aqui. Eu preciso de um procedimento automático para remover todas as palavras repetidas em um arquivo de texto. Este não deve ser um recurso estranho para um editor moderno ou corretor ortográfico, por exemplo, lembro que o MS Word introduziu esse recurso há vários anos! Aparentemente, a verificação ortográfica padrão no meu sistema operacional (hun-spell) não pode fazer isso, pois só encontra palavras que não estão no dicionário.

Não há problema em ter uma solução válida para um editor de texto específico para o linux (pluma / gedit2 ou Sublime-text) e uma solução baseada em um script bash.

    
por altroware 22.11.2014 / 23:46

2 respostas

10

Com o GNU grep:

echo 'Hi! Hi, same word twice twice, as as here here! ! ,123 123 need' |  grep -Eo '(\b.+) \b'

Saída:

twice twice
as as
here here
123 123

Opções :

-E : interprete (\b.+) \b como uma expressão regular estendida.

-o : imprime apenas as partes correspondentes (não vazias) de uma linha correspondente, com cada uma dessas partes em uma linha de saída separada.

Regex :

\b : é um limite de palavras de largura zero.

.+ : corresponde a um ou mais caracteres.

: os parênteses () marcam um grupo de captura e significa usar aqui o valor do primeiro grupo de captura.

Referência: Perguntas frequentes sobre expressões regulares de estouro de pilha

    
por 23.11.2014 / 10:30
1

Em geral, eu estaria pensando:

use strict;
use warnings;

local $/;

my $slurp = <DATA>;
$slurp =~ s/\b(\w+)\W/$1/go;
print $slurp;

__DATA__
Hi! Hi, same same? word twice twice, as as here here! ! ,123 123 need
need as here 

Tenha em mente, porém, um monte de correspondência de padrões é orientado por linha, então você precisa ser cuidadoso se cruzar os limites da linha. Se você puder excluir esse caso, terá um trabalho mais fácil porque poderá analisar uma linha por vez. Eu não estou fazendo isso, então você vai acabar lendo todo o arquivo na memória.

    
por 23.11.2014 / 14:25