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

Fermé
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006 - 13 avril 2006 à 14:45
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 25 juil. 2012 à 18:19
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.
A voir également:

4 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 avril 2006 à 15:12
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
fifto Messages postés 54 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 15 juin 2006
13 avril 2006 à 15:30
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 avril 2006 à 16:58
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
DjokoSnakeMakemba
25 juil. 2012 à 18:11
Pourrais-tu s'il te plait explain, ou alors mettre des commentaires?
Je comprends pas bien la syntaxe de ton grep là
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 25/07/2012 à 18:20
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
13 avril 2006 à 19:10
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