Question Trouver des mots répétés dans un texte


Une des fautes de frappe les plus courantes consiste à répéter le même mot deux fois, comme ici. J'ai besoin d'une procédure automatique pour supprimer tous les mots répétés dans un fichier texte. Cela ne devrait pas être une caractéristique étrange pour un éditeur ou un correcteur orthographique moderne, par exemple, je me souviens que MS Word a introduit cette fonctionnalité il y a plusieurs années! Apparemment, la vérification orthographique par défaut sur mon système d'exploitation (hun-spell) ne peut pas le faire, car elle ne trouve que des mots qui ne figurent pas dans le dictionnaire.

Il serait correct d'avoir une solution valide pour un éditeur d'éditeur de texte spécifique pour Linux (pluma / gedit2 ou Sublime-text) et une solution basée sur un script bash.


4
2017-11-22 22:46


origine


Perl est-il une alternative acceptable à bash? Parce que ce serait mon premier port d'escale. - Sobrique
@Sobrique S'il vous plaît, n'hésitez pas à l'ajouter! Je préférerais les réponses basées sur bash si - altroware


Réponses:


Avec GNU grep:

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

Sortie:

deux fois deux fois
comme comme
ici ici
123 123

Les options:

-E: Interprète (\b.+) \1\b comme une expression régulière étendue.

-o: N'imprimez que les parties correspondantes (non vides) d'une ligne correspondante, chacune de ces parties se trouvant sur une ligne de sortie distincte.

Regex:

\b: Est une limite de mot de largeur zéro.

.+: Correspond à un ou plusieurs caractères.

\1: Les parenthèses () marquer un groupe de capture et \1 signifie utiliser ici la valeur du premier groupe de capture.


Référence: FAQ sur les expressions régulières de débordement de pile


9
2017-11-23 09:30



Votre commande grep échoue pour le type d'exemple suivant: echo "the thesis" | grep -Eo '(\ b. + \ b) \ 1' sorties: le le. grep -Eo '(\ b. +) \ 1 \ b' semble fonctionner. Une idée pourquoi? - el_tenedor
@el_tenedor: Merci pour cet indice. J'ai ajouté un \b après la deuxième chaîne pour corriger ce bug de sous-chaîne. - Cyrus
Cependant, le second \ b dans la parenthèse semble être redondant. Pourquoi en avons-nous besoin? - el_tenedor
Oui, c'est redondant et peut être omis. - Cyrus
J'ai mis à jour ma réponse. - Cyrus


Perlishly, je penserais:

use strict;
use warnings;

local $/;

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

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

Gardez à l'esprit que beaucoup de correspondances sont orientées vers les lignes, vous devez donc faire attention si vous franchissez des limites de lignes. Si vous pouvez exclure ce cas, alors vous avez un travail plus facile car vous pouvez analyser une ligne à la fois. Je ne le fais pas, alors vous finirez par lire le fichier en entier.


1
2017-11-23 13:25



C'est génial, j'ai préféré la réponse basée sur bash, mais c'est bien aussi. - altroware
Perl se trouve dans presque autant d'endroits que bash et est plus complet en tant que langage de programmation. - Sobrique