[perl] Selectionner un bloc de texte [Résolu/Fermé]

Signaler
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
-
 :):):) -
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

Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
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 ++;
}
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
70
yep merci ^^
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
70
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.
Messages postés
18242
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
13 juin 2021
5 308
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
Messages postés
1050
Date d'inscription
mardi 20 octobre 2009
Statut
Membre
Dernière intervention
2 avril 2015
70
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:
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,