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 :

Supprimer ligne dans un fichier text


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut Supprimer ligne dans un fichier text
    Bonjour a tous.
    Voila mon pb :
    J'ai un fichier contenant un liste d'adresses ip déstinée à être scannées.
    Dans cette liste je veut supprimer certaines adresses pour pas qu'elle ne soit scannér par la suite.

    J'ais appliqué la methode (la numéro 2 je crois) conseillée par jedaï dans ce post :
    http://www.developpez.net/forums/sho...d.php?t=338344

    Voici mon 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
    19
    20
    while($lines = <FICH>)
    {
     
     
    		if ($lines=~/10\.0\.\d+\.\d+/)
    		{
    		$lines =~ s/10\.0\.\d+\.\d+//;
    		}
     
    		if ($lines=~/10.39.1.135/)
    		{
    		$lines =~ s/10.39.1.135//;
    		}
     
    		if ($lines=~/172.31.1.1{1}/)
    		{
    		$lines =~ s/172.31.1.1{1}//;
    		}
    print(FICHOUT "$lines");
    }
    Deux probléme se posent :

    - Je ne sait pas comment coder la suppression d'une ligne ici je la remplace par rien mais cela fait des "tours" dans mon fichier causé par des lignes vide.
    - Je n'arrive pas a detecter seulement l'adresse 172.31.1.1 at pas 172.31.1.10 172.31.1.11 172.31.1.12 etc

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Perso, je ferais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while($lines = <FICH>)
    {
            if ($lines !~ /(10\.0\.\d+\.\d+|/10.39.1.135|172.31.1.1{1})/)
    	{
                    print(FICHOUT "$lines");        	
    	}
    }
    Grosso modo, j'ai repris ta syntaxe et fait l'acheminement inverse. Puisque tu ne veux pas voir certaines lignes contenant des adresses IP dans ton nouveau fichier de sortie, je me borne à imprimer dans ce dernier toute ligne ne contenant pas les types d'adresses IP non souhaitées.

    Citation Envoyé par Gad29
    Deux probléme se posent :

    - Je ne sait pas comment coder la suppression d'une ligne ici je la remplace par rien mais cela fait des "tours" dans mon fichier causé par des lignes vide.
    Dans ce que tu fais, tu fais bosser Perl pour rien en lui demandant de remplacer une ligne par "rien" et tu aurais plus vite fait en faisant comme ceci : $line = "";

    Mais même là, tu te retrouves à écrire des lignes vides dans ton fichier, d'où l'acheminement inverse que je t'ai proposé.

    Citation Envoyé par Gad29
    - Je n'arrive pas a detecter seulement l'adresse 172.31.1.1 at pas 172.31.1.10 172.31.1.11 172.31.1.12 etc
    Ton adresse IP est-elle la seule information que tu trouves sur une ligne de ton fichier d'entrée ? Parce que si oui, tu peux rajouter un ancrage dans la regexp permettant de faire la recherche sur toute ligne se terminant par les adresses IP que tu ne veux pas. Et en remaniant la regexp que je t'ai donné, cela donnerait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($lines !~ /(10\.0\.\d+\.\d+|/10.39.1.135|172.31.1.1{1})$/)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Bien joué l'idée merci beaucoup c'est aussi simple et j'aurais juste un if de 2-3km mais ca osef.

    Sinon sauriez vous comment je pourrai coder une expression réguliére selectionant 172.31.1.1 et pas les 172.31.1.10 172.31.1.11 ......
    J'ais pas réussi a coder mieux que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($lines=~/172.31.1.1{1}/)
    Merci encore pour ta reponse ca me bluff toujours les trucs simple efficace auquels on pense pas

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par Gad29
    J'ais appliqué la methode (la numéro 2 je crois) conseillée par jedaï dans ce post :
    http://www.developpez.net/forums/sho...d.php?t=338344
    Et j'ajoute que la méthode 2 de Jedai consistait à modifier une ligne et de la réécrire ensuite modifiée dans le fichier de sortie. Dans ton cas, tu ne veux pas de la ligne, inutile donc de chercher à la modifier

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Citation Envoyé par Gad29
    Sinon sauriez vous comment je pourrai coder une expression réguliére selectionant 172.31.1.1 et pas les 172.31.1.10 172.31.1.11 ......
    J'ais pas réussi a coder mieux que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($lines=~/172.31.1.1{1}/)
    Je t'ai posé la question sur ce sujet, réponds-y et en fonction, ben je ferai tout pareil

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    J'ais repondut trop vite je n'avais pas lu la fin de ton post merci.
    Oui c'est un fichier réalisé a partir d'une base de donnée. Il n'y a pour information qu'une seule adresse ip par ligne.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Sinon sauriez vous comment je pourrai coder une expression réguliére selectionant 172.31.1.1 et pas les 172.31.1.10 172.31.1.11 ......
    J'ais pas réussi a coder mieux que
    Toujours pas réussit a le coder

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 582
    Points : 2 030
    Points
    2 030
    Par défaut
    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($lines !~ /(10\.0\.\d+\.\d+|10\.39\.1\.135|172\.31\.1\.1)$/)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Impécable ! Merci de me faire partager tes compétences et aussi merci de la vitesse de tes réponses.

    Pour le fun je post mon if entier , chapeau a celui qui en trouvera un plus long :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($lines !~ /(10\..+\..+\..+|172\.31\.1\.1{1}|172\.19\.2\.17|172\.31\.3\.1{1}|172\.31\.1\.19|172\.19\.2\.19|172\.19\.2\.254|193\.54\.246\.1{1}|172\.31\.2\.20|172\.31\.2\.21)$/)
    Bone continuation a tt le monde

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je ne préconiserais pas l'usage d'une regex si longue et complexe pour convoyer une information si simple... C'est l'enfer à entretenir ce genre de regex !
    Fais plutô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
    # au début du script (éventuellement à reléguer dans un fichier de config)
     
    my @IP_NOK = qw(
      172.31.1.1
      172.19.2.17
      172.31.3.1
      172.31.1.19
      172.19.2.19
      172.19.2.254
      193.54.246.1
      172.31.2.20
      172.31.2.21
    );
     
    my @IP_REGEX_NOK = qw(
      10\.\d+\.\d+\.\d+
    );
     
    my $rx = join '|', (@IP_REGEX_NOK, map { quotemeta $_ } @IP_NOK);
    $rx = qr/^(?:$rx)$/;
     
     
      # plus loin dans ta boucle :
      if( $line !~ m/$rx/ ) {
        # ...
      }
    Ainsi tu construis dynamiquement ta regex à partir de listes d'ip et de regex d'ip faciles à entretenir et modifier, au contraire de ta monstrueuse regex initiale... Au passage tu compiles également une bonne fois pour toute cette regex au lieu de le faire éventuellement à chaque passage dans la boucle (bien que l'absence de variable dans ta regex initiale ait probablement déjà provoqué cette optimisation, mais ce n'est pas certain)

    --
    Jedaï

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Points : 55
    Points
    55
    Par défaut
    Merci de ta suggestion jedaï je vais mettre ca en place tout de suite.
    C'est vrais que si je veut ensuite modifier ma regex ce sera beaucoup plus simple.
    Merci encore

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 28/06/2006, 13h31
  2. supprimer une ligne dans un fichier texte
    Par linouline dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2006, 23h02
  3. Supprimer une ligne dans un fichier texte
    Par @yoyo dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 28/03/2006, 14h19
  4. Supprime une ligne dans un fichier texte
    Par dev7 dans le forum Linux
    Réponses: 4
    Dernier message: 28/03/2006, 01h33
  5. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 16h43

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