IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[PERL] extraire une chaine de caractères sur 2 lignes d'un fichier txt


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 7
    Points
    7
    Par défaut [PERL] extraire une chaine de caractères sur 2 lignes d'un fichier txt
    Bonjour, voici mon problème: j'ai un fichier texte dans lequel je veux rechercher la chaine "interface vlanX". Jusque là tout est ok
    sauf qu'une fois cette chaine trouvé je veux récupérer la ligne suivante du fichier, puis la chaine suivante avec sa ligne etc...
    Mon fichier (extrait):
    !
    interface vlan3
    description PROD
    !
    interface vlan7
    description IMPRESSION
    !
    interface vlan128
    ip address 1.1.2.2/24
    !
    code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    use strict;
    use warnings;
    my $filename = "d:\\dev_perl\\cisco.cfg";
    open (FIC, '<', $filename) or die "Erreur : impossible d'ouvrir le fichier '$filename'";
    my @fic = <FIC>;
    foreach my $ligne (@fic)
    {	
    	chomp($ligne);
     
    	### recherche de la commande interface vlan ###
    	while ($ligne=~m/interface vlan(\w*)/)
    		{ 
    		my $testvlan = $1;
    		print ("interface vlan$testvlan\n"); 
    		last;
    		}
    }
    close (FIC);
    Comment faire pour avoir la ligne "ip address..." par exemple? Merci de votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    comme tu as mis ton fichier dans un tableau, il faut, quand tu rencontres une ligne "interface vlan" mettre un flag à vrai (par ex. 1) et, quand tu lis une ligne tu tableau vérifier la valeur du flag (s'il est vrai, alors traiter la ligne et récupérer l'IP s'il y en a une) et remettre le flag à faux. Le pseudo-code de la boucle pourrait être quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my $flag = 0;
    my ($id, $ip);
    for (...) {
        if (/vlan(\d+)/) {
            $id = $1;
            $flag = 1
        }
        if ($flag) {
            $ip = ...
            $flag = 0
        }
    }
    Dans ton code, je ne comprends pas pourquoi tu fais un while, alors qu'il faudrait, si je comprends ce que tu cherches à faire, un if.

    Personnellement, je ne chargerais pas le fichier dans un tableau mais lirais les lignes du fichier au fur et à mesure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (my $ligne = <FIC>) {
        if ($ligne =~ /interface vlan(\d+)/ ) {
            my $id = $1;
            my $next_line = <FIC>;
            # ... chercher une IP dans $next_line et l'utiliser
        }
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Merci à toi pour ton aide rapide.
    Je post pour ceux que cela intéresse le script complété:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    use strict;
    use warnings;
     
    my $filesource = "d:\\dev_perl\\x610.cfg";
    my $filedest = "d:\\dev_perl\\cisco.cfg";
     
    open (FIC_ENT, '<', $filesource) or die "Erreur : impossible d'ouvrir le fichier '$filesource'";
    open (FIC_SORT, '>>', $filedest) or die "Erreur : impossible d'ouvrir le fichier '$filedest'";
     
    	### recherche de la commande "interface vlan" dans le fichier source 
    while (my $ligne = <FIC_ENT>) {
        if ($ligne =~ /interface vlan(\d+)/ ) 
    	{
            ### ecriture du $id dans le fichier destination 
    		my $id = $1;
    		print (FIC_SORT "!\n");
    		print (FIC_SORT "interface vlan $id\n");
            # chercher une IP dans $next_line et l'utiliser
    		my $next_line = <FIC_ENT>;
     
    			if ($next_line =~/ip address (\d+.\d+.\d+.\d+)/ ) 
    			{
    				# ecriture de $ip dans le fichier destination
    				my $ip = $1;
    				print (FIC_SORT "ip address $ip 255.255.255.0\n");
    			}
        }
    }
    close (FIC_ENT);
    close (FIC_SORT);

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    La lecture par ligne n'est pas une fatalité, sans pour autant slurper tout le fichier d'entrée, tu peux modifier le séparateur d'enregistrement localement pour te simplifier la tâche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    use strict;
    use warnings;
     
    my $filesource = "d:\\dev_perl\\x610.cfg";
    my $filedest = "d:\\dev_perl\\cisco.cfg";
     
    open (my $fh_src, '<', $filesource) or die "Erreur : impossible d'ouvrir le fichier '$filesource'";
    open (my $fh_dst, '>>', $filedest) or die "Erreur : impossible d'ouvrir le fichier '$filedest'";
     
    {
        local $/ = "interface vlan";
        while (<$fh_src>) {
            next unless /^(\d+)\n(?:ip address ([\d.]+))?/;
            print $fh_dst "!\ninterface vlan $1\n", $2 ? "ip address $2 255.255.255.0\n" : "";
        }
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/11/2008, 15h16
  2. Extraire une chaine de caractères
    Par Sam_Dalembert dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/08/2008, 11h58
  3. extraire une chaine de caractères
    Par nopnop dans le forum C
    Réponses: 11
    Dernier message: 10/04/2007, 17h21
  4. Extraire une chaine de caractéres
    Par fatati dans le forum Oracle
    Réponses: 4
    Dernier message: 30/01/2007, 14h39
  5. Réponses: 9
    Dernier message: 19/12/2006, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo