J'ai un document texte qui a une charge de texte qui a un espace supplémentaire ajouté après chaque lettre!
Exemple:
T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t…
Visuellement:
T␣h␣e␣␣b␣o␣o␣k␣␣a␣l␣s␣o␣␣h␣a␣s␣␣a␣n␣␣a␣n␣a␣l␣y␣t␣i ␣c␣a␣l␣␣p␣u␣r␣p␣o␣s␣e␣␣w␣h␣i␣c␣h␣␣i␣s␣␣m␣o␣r␣e␣␣i␣ m␣p␣o␣r␣t␣a␣n␣t…
Notez qu'il y a un espace supplémentaire après chaque lettre, donc il y a deux espaces entre les mots consécutifs.
Existe-t-il un moyen d'obtenir awk
ou sed
de supprimer les espaces supplémentaires? (Malheureusement, ce document texte est volumineux et prendrait beaucoup de temps à parcourir manuellement.)
J'apprécie que c'est probablement un problème beaucoup plus complexe à résoudre avec un simple script bash car il doit également y avoir une sorte de reconnaissance de texte.
Comment puis-je aborder ce problème?
text-processing
sed
awk
scripting
lloowen
la source
la source
echo 't h i s i s a n e x a m p l e' | sed 's/ //g'
echo 'T h i s ; i s .a n 9 8 e x a m p l e' | perl -pe 's/[a-z]\K (?=[a-z])//ig'
Réponses:
L'expression régulière suivante supprimera le premier espace de toute chaîne d'espaces. Cela devrait faire l'affaire.
Donc quelque chose comme:
... remplacera infile.txt par une version "fixe".
la source
perl -pie
- comme le montre votre édition. Quelle en est la raison? La tarte a toujours bien fonctionné pour moi et est un grand mnémonique. Le comportement de -i a-t-il changé pour traiter tout ce qui suit comme une extension, plutôt que seulement les choses qui commencent par un point? Il leur semblerait étrange de casser quelque chose d'aussi idiomatique.-i
. D'un autre côté, je ne l'ai utilisé que sur des machines Linux et je ne le connais pas depuis plus de quelques années, donc je ne peux pas parler de son comportement plus ancien. Sur ma machine , cependant, ceci:perl -pie 's/a/b/' f
, produit une erreur:Can't open perl script "s/o/A/": No such file or directory
. Toutperl -i -pe 's/o/A/' f
fonctionne comme prévu. Alors oui, lee
est considéré comme l'extension de sauvegarde.Utilisez
wordsegment
un package NLP de segmentation de mots en Python pur:la source
Sur la base du fait que l'entrée comprend des espaces doubles entre les mots, il existe une solution beaucoup plus simple. Vous changez simplement les espaces doubles en un caractère inutilisé, supprimez les espaces et changez le caractère inutilisé en espace:
...les sorties:
la source
sed -e "s/\([^ ]\) /\1/g"
Perl à la rescousse!
Vous avez besoin d'un dictionnaire, c'est-à-dire d'un fichier contenant un mot par ligne. Sur mon système, il existe en tant que
/var/lib/dict/words
, j'ai également vu des fichiers similaires comme/usr/share/dict/british
etc.Tout d'abord, vous vous souvenez de tous les mots du dictionnaire. Ensuite, vous lisez l'entrée ligne par ligne et essayez d'ajouter des caractères à un mot. Si c'est possible, vous vous souvenez du mot et essayez d'analyser le reste de la ligne. Si vous atteignez la fin de la ligne, vous sortez la ligne.
Pour votre entrée, il génère 4092 lectures possibles sur mon système.
la source
a cat a log
iea c a t a l o g
Remarque: cette réponse (comme quelques autres ici) est basée sur une version antérieure de la question où les mots n'étaient pas délimités. On peut répondre trivialement à la nouvelle version .
Sur une entrée comme:
Tu pourrais essayer:
Il traite de gauche à droite et trouve un mot le plus long après le suivant.
Évidemment, ici, ce n'est pas la meilleure sélection de mots car cette phrase n'a aucun sens, mais pour trouver la bonne, vous auriez besoin d'outils capables de comprendre la grammaire ou le sens du texte ou au moins quelques statistiques des informations sur les mots susceptibles d'être trouvés ensemble pour trouver l'ensemble de mots le plus probable. On dirait que la solution est une bibliothèque spécialisée trouvée par Lynn
la source
Similaire à la version de Dewi Morgan, mais avec sed:
la source
sed
uniquement et ce n'est pas équivalent à Dewi. L'sed
équivalent standard de Dewi seraitsed 's/ \( *\)/\1/g'
Bien que cela puisse (et devrait) être fait avec une doublure Perl, un petit analyseur C serait également très rapide, et est également très petit (et, espérons-le, très correct):
Compilé avec
(le programme est un peu moins de 9kb)
Utiliser dans un tuyau comme par exemple:
la source
J'ai essayé cela et cela semble fonctionner:
La
sed
commande capture deux groupes et renvoie uniquement le premier.la source
En c ++, je ferais ceci:
Modifie le contenu du fichier texte de test, dans la même chaîne, mais en supprimant les espaces entre les lettres. (Il faut un espace entre chaque lettre pour être précis).
la source
la source