Récupérer toutes les occurences d'un mot..

Récupérer toutes les occurences d'un mot.. - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 31-08-2006 à 16:50:11    

Salut la communauté,
 
Je veux récupérer toutes les occurences de mots commençant par TTP.. dans un fichier texte.
Je suis sous Solaris. Le sed 's/.*\(TTP.*\).*/\1/g' ne marche pas car sed a une attitude maximaliste : il va essayer de capturer le maximum de texte correspondant au pattern TTP.* et donc il me retourne tout ce qui vient après le mot commençant par TTP jusqu'à la fin de la ligne au lieu du mot tout seul.
 
Qq1 a une idée ?
 
Merci.

Reply

Marsh Posté le 31-08-2006 à 16:50:11   

Reply

Marsh Posté le 01-09-2006 à 09:05:28    

je connais pas super bien sed, mais en perl je ferais ça:

perl -ne 's/.*(TTP\S+).*/$1/g; print;'


 
C'est ça que tu voulais ?


---------------
TriScale innov
Reply

Marsh Posté le 01-09-2006 à 12:15:14    

Merci franceso pour ta réponse.
Je connais rien à perl, mais ta commande ne marche pas quand le mot finit en un caractère non alphanumérique.
Par exemple ta commande retourne la ligne :  
 

TTPConnection;)[Ljconnect/srv/data/..


Alors que tout ce que je veux capturer sur cette ligne est : TTPConnection.
 
J'aurais pensé que mon bonheur serait dans :

perl -ne 's/.*(TTP[:alnum:]+)[^:alnum:].*/$1/g; print;'


mais je ne sais pas pourquoi cette version ne parche pas non plus..
 
J'ai trouvé une solution plus laborieuse avec sed :  
 

egrep "TTP[A-Za-z0-9]" mon_fichier | sed -e 's/\(TTP[A-Za-z0-9]\{1,\}\)/\1^M/g' | sed -e 's/^.*\(TTP[A-Za-z0-9]\{1,\}\).*$/\1/g'


Le ^M résulte de Cntr-V-Enter.
Ca ne retourne pas les mot exactement égaux à "TTP", mais tout le reste. Ca me va, mais si qq1 peut encore améliorer ça, ça m'intéresserait !

Message cité 1 fois
Message édité par p-seeker23 le 01-09-2006 à 12:20:16
Reply

Marsh Posté le 01-09-2006 à 12:20:07    

En remplaçant le savant \{1,\} par un simple *, j'ai toutes les occurences.  
C'est exactement ce que je veux, mais ça me semble bien laborieux (et déconseillé en cas de gros fichier à parser).
Donc je suis toujours preneur d'une solution plus concise/efficace !  ;)

Reply

Marsh Posté le 01-09-2006 à 13:43:30    

p-seeker23 a écrit :

ta commande ne marche pas quand le mot finit en un caractère non alphanumérique.


Alors essaie

perl -ne 's/.*(TTP\w*).*/$1/g; print;'


 
Je te propose ça parce que c'est quelque chose de proche de ton essai initial, mais je ne sais pas si ça fera exactement ce que tu veux. Par exemple tu risques d'avoir des problèmes s'il y a plus de 2 TTP* par ligne, ou si au contraire certaines lignes ne contiennent pas de mots en TTP.
 
Si tu me donnes plus de détails sur ce que tu veux faire et sur le type d'entrée que tu as, je pourrai sans doute te donner plus de conseils...


---------------
TriScale innov
Reply

Marsh Posté le 01-09-2006 à 14:28:05    

Cette nouvelle mouture marche parfaitement, sauf qu'elle ne récupère qu'une seule occurence par ligne (d'où le ^M dans mon sed).
Dans le fichier exemple suivant :  

TTP
TTP;
TTPaz1 aaa (TTP1_bbb); TTP2ds
bbb TTPhd3B aaa ;
bbb TTPhd5B.. ;
bbb aaa/TTPhd5B/..
bbb aaa/TTPhd


sur la 3ème ligne, seul TTP2ds est récupéré.
Ce fichier résumes toutes les situations où les noms TTP* apparaissents dans mon fichier..
 
Merci pour tes efforts !  :jap:

Reply

Marsh Posté le 01-09-2006 à 15:58:05    

nouvel essai:

perl -ne 'while (/^(.*\b)(TTP\w*).*$/){print $2."\n"; $_=$1}'


 
ca a l'air de marcher sur ton fichier d'exemple.


---------------
TriScale innov
Reply

Marsh Posté le 04-09-2006 à 15:51:55    

Ca marche à la perfection !  :wahoo:  
Merci beaucoup !  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed