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 :

Débutant - Suppression de lignes dans un fichier


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 69
    Points
    69
    Par défaut Débutant - Suppression de lignes dans un fichier
    Bonjour,

    Je suis débutant en unix et en perl (tout va donc pour le mieux !!) et j ai un petit souci avec un fichier monfichier.xml qui contient des données corrompues : normalement dans une ligne j ai <mesdata> <data1> ... </data1> <data2> ... </data2> </mesdata>
    mais là j ai certaines lignes avec <mesdata> <data1> ... </data1> <data2> ... </data2> <mesdata> <data1> ... </data1> <data2> ... </data2> </mesdata>

    En gros je voudrais supprimer toutes les lignes comportant cette erreur ...


    La commande qui me permet de voir ces lignes :
    cat monfichier.xml | perl -ne '$i++; next unless m:.<mesdata:; print "$i : $_";' | less
    Celle de les compter :
    cat monfichier.xml | perl -ne '$i++; next unless m:.<mesdata:; print "$i : $_";' | wc -l
    Mais comment puis je faire pour les supprimer ?

    Merci de votre aide ...

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    C'est cool, ça me fait un prétexte pour me documenter sur les one-liners, aspect de Perl que je n'avais que survolé.

    Avant d'entrer dans le vif du sujet, quelques remarques sur tes commandes :
    Tout d'abord, tu peux te passer de la commande cat, et mettre directement ton nom de fichier en argument de la commande perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne '$i++; next unless m:.<mesdata:; print "$i : $_";' monfichier.xml | less
    Ensuite, tu n'as pas besoin de $i++ pour afficher tes numéros de lignes, il existe une variable spéciale pour ça(*) : $.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print "$. : $_" if (m:.<mesdata:)' monfichier.xml | less
    Bon, maintenant, ce que l'on veut, c'est afficher tout sauf les lignes comportant cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print unless (m:.<mesdata:)' monfichier.xml | less
    J'ai pris la liberté d'enlever l'affichage des numéros de lignes, vu que c'est moins pertinent ici. Du coup, le print n'affichant plus que $_, qui est la variable par défaut, je rends cette dernière implicite en ne donnant pas d'argument à print.

    Mais le but ultime c'est quand même de modifier le fichier. Eh bien, pour ça, il y a l'option -i, qui remplace le contenu du fichier par la sortie de la commande. Elle a, de plus, l'aspect très pratique de pouvoir prendre un argument alphanumérique quelconque qu'elle va utiliser comme extension pour faire un backup.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -iWAHAAAGH838 -ne 'print unless (m:.<mesdata:)' monfichier.xml
    Ce qui nous donne le fichier monfichier.xml modifié comme tu le souhaites, et un fichier monfichier.xmlWAHAAAGH838 qui est une copie du fichier avant modification. Bon, d'accord, généralement on n'utilise pas un truc comme "WAHAAAGH838" comme extension, mais plutôt des trucs comme ".old" ou ".bak". C'était juste un exemple.

    (*) Soit dit en passant, en Perl, si on peut se dire "tiens, ça serait vachement utile dans plein de situations" (ici, un moyen simple d'afficher le numéro de ligne) on peut être à peu près sûr que ça existe déjà, particulièrement si ça concerne du texte.

Discussions similaires

  1. [débutant] ecriture de lignes dans un fichier
    Par SPACHFR dans le forum Débuter
    Réponses: 24
    Dernier message: 30/05/2007, 22h03
  2. Suppression de lignes dans un fichier texte
    Par Isa31 dans le forum Langage
    Réponses: 16
    Dernier message: 26/01/2006, 20h07
  3. Suppression de lignes dans un fichier sous dos
    Par ducho dans le forum Windows
    Réponses: 2
    Dernier message: 16/05/2005, 10h20
  4. Suppression de lignes dans un fichier
    Par bubu dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 10h36

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