[perl] Selectionner un bloc de texte

Résolu/Fermé
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 - 7 avril 2010 à 13:50
 :):):) - 7 juil. 2010 à 17:35
Bonjour,
j'ai un fichier texte de cette forme :

!!!TOM
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent id mauris eros. Aliquam vel ligula nulla. 

Proin varius, erat ut blandit pulvinar, 
massa nulla molestie diam, non accumsan libero orci eu velit. 

!!!BOB
Aenean elementum erat vel nulla congue tempor. Donec sit amet mi mauris. Curabitur nec fermentum dui. Mauris ut velit libero, non consequat ipsum. Fusce id neque a quam sagittis convallis 
ac eget lacus. Proin ultrices                                   aliquet congue. Etiam accumsan aliquet lectus. Nunc tempor lobortis



Donc, de ce fichier texte je connais "!!!", "BOB" et "TOM".

Le but serait de sélectionner tout le bloc de texte après "!!!TOM" et s'arrêter avant "!!!BOB".

Si vous savez comment faire je suis preneur ;)

A+

5 réponses

dubcek Messages postés 18562 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 novembre 2022 5 563
Modifié par dubcek le 7/04/2010 à 14:59
hello
$ perl -e '$i=0;while(<>){if(/TOM/){$i=1;next};$i=0 if /BOB/; print if $i}' fichier   
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent id mauris eros. Aliquam vel ligula nulla.    

Proin varius, erat ut blandit pulvinar,    
massa nulla molestie diam, non accumsan libero orci eu velit.    

$
2
dubcek Messages postés 18562 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 novembre 2022 5 563
7 avril 2010 à 15:58
comme ça ?
open (FILE, "mod.txt");
@lignes = <FILE>;
close(FILE);
$i = 0;
$f = 0;

while ( @lignes ){
        if ($lignes[$i] =~ /!!!TOM/)
                {$i++; $f=1; next}
        if ($lignes[$i] =~ /!!!/)
                {last}
        if($f)
                {print $lignes[$i]};
        $i ++;
}
1
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 73
7 avril 2010 à 16:00
yep merci ^^
0
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 73
7 avril 2010 à 15:00
Yes, merci bien.

As tu une solution avec la contrainte où je ne connais que TOM ou BOB ?

Car je ne peux pas connaitres les 2 en mêmes temps dans mon code, disons que je peux connaitre celui que je cherche mais pas le suivant.

Imaginons que je cherche le bloc de TOM, je connais TOM et "!!!" mais je ne sais pas ce qu'il va y avoir avant ou après.
0
dubcek Messages postés 18562 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 novembre 2022 5 563
7 avril 2010 à 15:11
si tu ne connais que TOM, quelle est la condition de fin du bloc ?
ou si tu ne connais que BOB, quelle est la condition de début du bloc ?
à la place de if(/TOM/), on peut tester une variable
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fxtaa Messages postés 1050 Date d'inscription mardi 20 octobre 2009 Statut Membre Dernière intervention 2 avril 2015 73
7 avril 2010 à 15:16
La condition de début de bloc est les 3 !. J'ai fait ca mais je trouve pas ca super optimisé ... :
open (FILE, "mod.txt");
@lignes = <FILE>;
close(FILE);
$i = 0;
$v = 1;

while ( @lignes ){
	if ($lignes[$i] =~ /!!!TOM/){
		
		while ($lignes[$v] =~ /^[^!!!]/){
			print "$lignes[$v]\n";
			$v ++;
		}
		if ($lignes[$v] =~ /!!!/){
			goto B;
		}
	}
	$i ++;
	$v = $i+1;
}
B:
0
Bonjour,

Plus simple
open(FILE, "mod.txt");
my @array;

while(FILE)
{

push @array, $_ if /!!!BOB/.../!!!TOM/;

}
pop @array;
shift @array;

print @array;

ou quelquechose comme ça.

Merci,
0