Rechercher : dans
Par :

[perl] soucis regexp et parcours dir

Dernière réponse le 30 jan 2007 à 12:27:26 LittleBouda, le 29 jan 2007 à 23:43:21 
 Signaler ce message aux modérateurs

Bonjour,

Je me remet au Perl, et j'ai quelques sérieuses difficultés...
En effet, mon script trouve bien le fichier, trouve mon expression régulière, mais visiblement, reste bloqué sur le chomp();

#!/usr/bin/perl -w

############################################################­###########
# Programme perl de parcours de fichiers dans un répertoire. #
# Recherche d'une expression régulière dans ces fichiers. #
# Suppressions de nombreuses lignes, une fois l'expReg trouvée.
############################################################­###########
# help : http://www.unix.org.ua/orelly/perl/




#$chemin = "/home/test/";
#opendir REP, $chemin
#or die "impossible d'ouvrir le repertoire : $!";
#@fichiers = readdir REP;
#closedir(REP);

#foreach $fichier (@fichiers)
#{
#$full_path=$chemin.$fichier;
#print "$full_path\n";


# verifier les droits d'ecriture sur le fichier...
##################################################
open(FILE, '+<C:/Documents and Settings/toto/Mes documents/mon_test.txt')
or die ("probleme a l'ouverture du fichier : $!" );

#print "$fichier\n";
my @ligne = <FILE>;
my $chaine ="mon image A\.jpg";
my $i=0;
foreach $ligne(@ligne)
{
if ($ligne=~/$chaine/)
{
$i++;
while ($i<10)
{chomp ($ligne);}
}
else {printf("mauvaise expression reguliere\n");}
#next FILE;
}
close(FILE);
#}
exit(0)



Le résultat :
mauvaise expression reguliere
mauvaise expression reguliere
mauvaise expression reguliere
mauvaise expression reguliere
Terminating on signal SIGINT(2)

(dernière ligne obtenue après ctrl+c car bloqué : la chaine trouvée se trouve en effet à la 5° ligne de mon fichier texte...)

Précision : comme dit en commentaire, le but est de supprimer plusieurs lignes une fois la regExp trouvée.


Une petite aide ne serait pas de refus :o)

Merci,
A+

Configuration: Windows XP
Firefox 1.5.0.9

Meilleures réponses pour « [perl] soucis regexp et parcours dir » dans :
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Les variables avec Perl VoirConcept de variable avec Perl Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage Perl peuvent être de trois...
Javascript - L'objet RegExp VoirLes particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des...

1

LittleBouda, le 30 jan 2007 à 10:48:20

Bon, j'avance petit à petit, cependant, je n'arrive pas :

Ni à supprimer les lignes que je veux ni à faire un remplacement;

J'aimerai bien savoir si mes variables sont bien interprétées dans mon expression régulière, car je ne rentre pas dans la boucle suivante de substitution....

Voilà à quoi ressemble désormais mon script :



#!/usr/bin/perl -w

############################################################­#
# Programme perl de parcours de fichiers dans un rértoire. #
# Recherche d'une expression regul dans ces fichiers. #.....#
# Suppressions de nombreuses lignes, une fois l'expReg trouv#
############################################################­#
# help : http://www.unix.org.ua/orelly/perl/


$chemin = "/home/boites_test";
opendir REP, $chemin
or die "impossible d'ouvrir le repertoire : $!";
@fichiers = readdir REP;
closedir(REP);

foreach $fichier (@fichiers)
{
# si la valeur retournee est un repertoire
# je passe a la suite :
# next if ($fichier eq "." or $fichier eq "..");
next if -d $fichier;
$full_path="$chemin/$fichier";
print "$full_path\n";


# verifier les droits d'ecriture sur le fichier...
##################################################
open(FILE, "+< $full_path")
or die ("probleme a l'ouverture du fichier : $!" );

#print "$fichier\n";
my @ligne = <FILE>;
#my $chaine = "carton J-F Kahn\.pdf";
my $chaineDeb = "carton J-F Kahn\.pdf";
my $chaineFin = "-------NWM";
my $remplacement = "Cette piece jointe a ete supprime pour cause de surcharge serveur.";
my $i=0;
foreach $ligne(@ligne)
{
#if ($ligne=~/$chaine/)
if ($ligne=~ m/$chaineDeb.*$chaineFin/)
{
print "trouvee";
$ligne=~ s/$chaineDeb.*$chaineFin/$remplacement/;
}
#{
#while ($i<10)
# {
# print "un moulin !!^^\n";
# chomp ($ligne);
# $i++;
# }
#}
}
close(FILE);

Répondre à LittleBouda

2

lami20j, le 30 jan 2007 à 11:22:04

Salut,


Précision : comme dit en commentaire, le but est de supprimer plusieurs lignes une fois la regExp trouvée.

si ton but est toujours celui là alors tu compliques bien les choses

si tu veux supprimer les lignes qui contennent une regex (c'est ça que j'ai compris) tu n'as qu'à écrire tout bête

while (<>){
                          # à remplacer motif avec ta regex
    print unless /motif/; # je saute la ligne correspondant au motif
}
et tu exécutes le script avec la commande

perl script.pl mon_test.txt > resultat.txt
--
lami20j

Répondre à lami20j

3

lami20j, le 30 jan 2007 à 11:31:59

Pour ne pas dire que sous linux une seule commande avec rgrep ou find combiné avec egrep souffira :-)) lami20j

Répondre à lami20j

4

lami20j, le 30 jan 2007 à 11:46:04

Et attention, si tu ne travaille dans le répertoire courant ça ne va pas marcher
next if -d $fichier;

tu dois écrire

next if -d $chemin/$fichier

lami20j

Répondre à lami20j

5

LittleBouda, le 30 jan 2007 à 11:59:46

Bonjour,

Merci,

Non, en fait, je veux supprimer un groupe de ligne, situé entre 2 expressions dans tous les fichiers d'un répertoire, et non pas juste la ligne où se trouve l'expression régulière.

exemple de fichier texte :


blablablabla
totototototot
bubu
mqldkfqdjf
smeflkeh
ok
klsdjfklsjd
kdsjfk

Il faut alors supprimer tout ce qui se trouve entre bubu et ok ; la ligne bubu et ok étant comprises.

Répondre à LittleBouda

6

lami20j, le 30 jan 2007 à 12:18:36

Salut,

pour sauter des paragraphes on peut utiliser

while(<>){
  # on supprime les paragraphe
  # compris entre motif_debut et motif_fin
  print unless /motif_debut/.../motif_fin/;
}
je pense que ça sera mieux si tu me montre un de tes fichiers
et de dire ce que tu veux supprimmer

une des erreurs qui font ceux qui demande
c'est qu'ils ne donnent pas les détails

par exemple dans le cas des regex c'est imperatif
de connaître la structure de fichiers en entrée
et de savoir ce qu'on veut obtenir en sortie

à toi lami20j

Répondre à lami20j

7

 LittleBouda, le 30 jan 2007 à 12:27:26

Je t'ai envoyé un mp avec un exemple de fichier à modifier.

J'attend de tes nouvelles, merci.

Répondre à LittleBouda
Collection CommentÇaMarche.net