[perl] copie fichier1 -> fichier2 sauf début

fifto Messages postés 54 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'aimerais faire quelque chose sous perl:

Je lis un fichier texte, et je le copie dans un autre fichier texte dès que je trouve le mot "DEBUT" ainsi que les 3 lignes précédent ce mot.

C'est à dire que par exemple, si mon fichier de départ est:

llllll
kkkkk
lll
ooo
ppp
o
phdoj
230487130
DEBUT
etc....jusque fin de fichier

mon nouveau fichier est :

o
phdoj
230487130
DEBUT
etc....jusque fin de fichier

Voilà, j'ai déjà réussi à écrire dans le nouveau fichier à partir du mot DEBUT, mais je ne sais pas comment conserver les 3 lignes d'avant..
Qqn pourrait m'aider svp ?
merci.

4 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Si tu postais ce que tu a déjà écrit, celà ferait grandement avancer le "schmillblick" et ferait par la même gagner un temps précieux à notre ami "lami20j", non ?

    De plus celà t'aiderait sûrement un peu plus du fait que si des incohérences existent dans ton code, elles seraient revues et corrigées au passsage.

    ;-))
    0
  2. fifto Messages postés 54 Statut Membre
     
    oui t'as raison pardon.

    Voilà ce que j'ai écrit:

    #! /usr/freeware/bin/perl

    use warnings;
    use strict;

    open TTXT ,"fichier1.txt" or die "E/S";
    open NEW ,">nouveau.txt" or die "E/S";

    open NEW2 ,">nouveau.txt" or die "E/S";

    while(<TTXT>){
    next unless (/DEBUT/i../END/i);
    print NEW $_;
    }

    MAis ce code affiche à partir de "DEBUT" dans le nouveau fichier, pas les 3 lignes avant ce mot..
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Merci.

    Tu le veux absolument en Perl ton code ?

    Parce qu'avec un simple filtre comme "grep" ça peut le faire sur une seule petite ligne de commande...
    grep -B 3 -A "$(cat fich.txt | wc -l)" "DEBUT" fich.txt > fichier.txt
    ;-))
    0
    1. DjokoSnakeMakemba
       
      Pourrais-tu s'il te plait explain, ou alors mettre des commentaires?
      Je comprends pas bien la syntaxe de ton grep là
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Salut,

      man grep !
      Contrôle des lignes de contexte 
      -A N, --after-context=N 
      
      Afficher les N lignes qui suivent celle contenant le motif. Une ligne contenant -- est insérée entre les groupes contigus de correspondances. Avec l'option -o ou --only-matching, ça n'a aucun effet et un avertissement est affiché. 
      
      -B N, --before-context=N 
      
      Afficher les N lignes qui précèdent celle qui contient le motif. Une ligne contenant -- est insérée entre les groupes contigus de correspondances. Avec l'option -o ou --only-matching, ça n'a aucun effet et un avertissement est affiché.
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    #! /usr/bin/perl
    
    use warnings;
    use strict;
    
    my (@lignes3,@rest);
    
    while (<DATA>){
      next if 1../DEBUT/i and push @lignes3,$_;
      splice(@lignes3,0,-4);
      push @rest,$_;
    }
    print @lignes3,@rest;
    __END__
    llll
    kkkkk
    ksdjkfjlll
    ooo
    ppp
    o
    phdoj
    230487130
    DEBUT
    etc....jusque fin de fichier
    
    La solution de jipicy est bien plus simple.
    C'est très bien d'utiliser les outils déjà existentes.
    
    A toi de voir.
    
    lami20j
    
    0