2010-08-10 25 views
1

je tentais de formater un journal de chat pour un ami qui ressemble à ceci:Comment insérer une nouvelle ligne 3 espaces blancs ou 2 mots avant caractère spécifique

John Smith> bonjour DOE Jane> hey comment vas-tu? John Smith> Très bon grâce

et elle veut formater comme ceci:

John Smith> bonjour

DOE Jane> hey comment vas-tu?

John Smith> Très bon grâce

entrant simplement une nouvelle ligne après> est pas assez bon car il ne serait pas formater correctement, donc j'ai besoin d'insérer une nouvelle ligne 3 espaces blancs, ou 2 mots avant la ">" donc le nom est capturé aussi.

Jusqu'à présent, je ne dispose que d'une nouvelle ligne après>:

/usr/bin/perl -p -i -e "s /> /> \ n/g" * txt

Modifier : Il y a environ 20+ noms de chat différents impliqués donc ce serait génial de le faire sans entrer tous leurs noms, car ils peuvent varier, et j'aimerais apprendre de l'exercice pour le plaisir. Merci pour la lecture

+0

Est-ce juste un journal de messagerie instantanée entre deux personnes? Il existe un moyen assez simple de gérer le cas où vous connaissez les noms d'utilisateur dans le journal. – eldarerathis

+0

C'est une discussion de groupe avec une vingtaine de noms différents, donc j'essayais d'éviter de taper tous les noms, car ils peuvent varier légèrement à chaque session. C'est une interface web merdique qui permet seulement de sélectionner le texte et le copier coller, mais il ne conserve pas le formatage ... –

+0

Donc les noms d'utilisateur sont toujours deux mots, avec un espace entre les deux mots et un autre espace entre le second mot et le ' > '? – eldarerathis

Répondre

1

Essayez celui-ci:

perl -p -i -e "s/(\w+\s\w+\s*>)/\n\1/g" log.txt 

Test I utilisé pour la regex:

[21:21:23] ~ $ echo 'John Smith > hello Jane doe > hey how are you? John Smith > Pretty good thanks Susie Someone > hi guys' > log.txt 
[21:21:24] ~ $ more log.txt 
John Smith > hello Jane doe > hey how are you? John Smith > Pretty good thanks Susie Someone > hi guys 
[21:21:27] ~ $ perl -p -i -e "s/(\w+\s\w+\s>)/\n\1/g" log.txt 
[21:21:34] ~ $ more log.txt 

John Smith > hello 
Jane doe > hey how are you? 
John Smith > Pretty good thanks 
Susie Someone > hi guys 
[21:21:37] ~ $ 

Il fait ajouter une nouvelle ligne supplémentaire au début du fichier, mais si ce doesn Je ne vous dérange pas alors je pense que ça devrait marcher.

Éditer: Il échouera également si quelqu'un a utilisé un caractère > dans un de ses messages pour une raison quelconque (s'il était précédé d'un espace et de deux mots, de toute façon).

+0

Parfait merci beaucoup !!!! –

+0

Ouais dans le cas rare où un de ces hoquet se produirait une édition manuelle sera bien, mais il vaut mieux alors qu'elle passe par chaque ligne et édite manuellement! :) –

+0

qu'en est-il des cas où le texte est copié? 'John Smith> Jane Doe> nom/texte par Jane Doe, copié/collé par John Smith. 'Il apparaîtra juste comme une ligne vierge de John Smith, puis Jane Doe de plus tôt. Avez-vous la possibilité de contrôler l'application qui crée le journal? – vol7ron

0

Je sais que vous avez déjà un script "assez bon". Mais je pensais que je suggérerais une stratégie alternative de toute façon.

Gérez cette tâche en deux parties.

Première partie: Analyser les données brutes et extraire une liste de noms d'utilisateur.

  • Rechercher des groupes de mots répétés (jusqu'à X longueur) précédant >.
  • Générez une liste de noms d'utilisateur possibles.

Ici, un humain intervient et approuve la liste des noms d'utilisateur.

Deuxième partie: traiter les données en fonction d'une liste de noms d'utilisateur.

  • Traiter les noms de fichiers et l'utilisateur de correspondance à utiliser comme délimiteurs

L'avantage de ce procédé est que vous pouvez gérer correctement inline > caractères dans la sortie finale.Au moins tant que personne ne tape un nom d'utilisateur valide suivi d'un >.

Bien sûr, le code sera plus complexe. Si la complexité ajoutée vaut la précision améliorée dépend de vos besoins.