Rechercher : dans
Par :

(sed/Perl) supprimer des lignes d'un fichier

Dernière réponse le 3 sep 2009 à 12:06:54 titexe, le 12 déc 2006 à 22:40:45 
 Signaler ce message aux modérateurs

Bonjour,

comment supprimer les 2 premiers lignes d'un fichier et les 2 derniéres lignes d'un fichier ,

sachant que chaque fichier peuvent avoir un nombre de lignes différent de l'autre.

Merci d'avance,

Cordialement.

Configuration: Windows XP
Internet Explorer 6.0

1

jipicy, le 12 déc 2006 à 23:15:28

Salut,

sed -i.bak '1,2d;$d' ligne.txt && sed -i.old '$d' ligne.txt
Les "-i.bak" et "-i.old" c'est pour faire une copie de sauvegardes des fichiers originaux.
Un exemple :
[jp@MDK tmpfs]$ cat ligne.txt

1ère ligne
2ème ligne
3ème ligne
4ème ligne
5ème ligne
6ème ligne
7ème ligne
8ème ligne
9ème ligne
10ème ligne

[jp@MDK tmpfs]$ sed -i.bak '1,2d;$d' ligne.txt && sed -i.old '$d' ligne.txt

[jp@MDK tmpfs]$ cat ligne.txt

3ème ligne
4ème ligne
5ème ligne
6ème ligne
7ème ligne
8ème ligne

[jp@MDK tmpfs]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

lami20j, le 13 déc 2006 à 18:46:20
  • +2

Salut,

et voilà en Perl

j'ai considéré aussi la possibilité que le fichier commence et se fini avec des lignes vides qu'on ne veux pas les prendre en compte

$ grep -n '^.*$' fichier
1:
2:
3:1
4:2
5:3
6:
7:4
8:5
9:
10:6
11:7
12:8
13:9
14:
15:


donc les lignes 1 et 2 et 14 et 15 sont vides (je ne les comptes pas)
$ perl -e '@f=<>;pop @f while($f[-1]=~/^$/);shift @f while($f[0]=~/^$/);print@f[2..$#f-2]' fichier > resultat
$ cat resultat
3

4
5

6
7


Si je veux prendre en compte les lignes vides (si jamais elles existent)
$ perl -e '@f=<>;print@f[2..$#f-2]' fichier > resultat
$ cat resultat
1
2
3

4
5

6
7
8
9
lami20j

P.S. Les commandes sont sur une seule ligne

Répondre à lami20j

3

phoenix1984, le 1 sep 2009 à 13:29:40

Hello !

alors cette commande fonctionne tres bien ... dans mon cas il s'agit de supprimer les 288 lignes d'un fichier .. par contre je souhaiterais passer cette commande directement dans un programme PERL ..
je ne vois pas comment passer les fichiers en arguments par contre ...

merci de votre aide ! :)

Répondre à phoenix1984

4

lami20j, le 1 sep 2009 à 13:34:21

Salut,

Les 288 lignes se trouve où, au début ou à la fin de fichier? 106485010510997108

Répondre à lami20j

5

lami20j, le 1 sep 2009 à 13:37:55

Re,

Pour les 288 premières lignes par exemple (Attention: je n'ai pas testé)

Tu écris dans un script que tu l'appelleras suppr_lignes.pl

#!/usr/bin/perl -i.orig
use strict;use warnings;

while(<>){
    print "$_"  for 289 .. eof();
}
__END__

Ensuite tu lances le script avec la commande
perl /chemin/vers/suppr_lignes.pl fichier1 fichier2 ....... fichierN

Pour chaque fichier une sauvegarde sera faite avec l'extension .orig 106485010510997108

Répondre à lami20j

6

phoenix1984, le 1 sep 2009 à 14:04:43

Merci !! :)

oui c'est bien les 288 premieres ligne ... oublié de préciser pardon ...

par contre mon vrai soucis serait de piuvoir mettre le nom des fichiers dans le programme ...

c'est des noms fixes ... je pensais utiliser des variables, mais je ne vois pas comment faire pour faire pointer la commande de suppression sur ces fichiers dans le programme ...

Merci à toi :)

Répondre à phoenix1984

7

lami20j, le 1 sep 2009 à 14:20:52

Re,

On utilise le tableau spécial @ARGV

#!/usr/bin/perl -i.orig
use strict;use warnings;

@ARGV=("/chemin/vers/fichier1", "/chemin/vers/fichier2");

while(<>){
    print "$_"  for 289 .. eof();
}
__END__


Tu lances avec la commande
perl /chemin/vers/suppr_lignes.pl
106485010510997108

Répondre à lami20j

8

phoenix1984, le 1 sep 2009 à 16:03:08

Merci bien pour ta réponse, comme toujours aussi rapide et sympa !

bonne journée !

Répondre à phoenix1984

9

phoenix1984, le 2 sep 2009 à 10:30:50

Bonjour,

j'ai un petit soucis avec le script d'hier ... je n'avais pas eu le temps de le tester avant ce matin ..

contenu de mon répertoire :

fichier.log
suppr_ligne.pl

contenu du script

#!/usr/bin/perl -i.orig
use strict;use warnings;

@ARGV=("fichier.log");

while(<>){
print "$_" for 289 .. eof();
}
__END__



une fois le script exécuté, le fichier fichier.log est vide et tout le contenu est bien présent dans la sauvegarde fichier.log.orig

étrange ... et le fichier initial contient bien plus de 288 lignes ...

Si tu as une réponse je suis preneur, je continue à chercher de mon côté

merci !

Répondre à phoenix1984

10

lami20j, le 2 sep 2009 à 12:07:02
  • +1

Salut,

Au lieu de for mets if 106485010510997108

Répondre à lami20j

11

 phoenix1984, le 3 sep 2009 à 12:06:54

Tres bien, ca fonctionne parfaitement avec IF, donc pour résumer ton code :

#!/usr/bin/perl -i.orig
use strict;use warnings;

@ARGV=("fichier.log");

while(<>){
print "$_" if 289 .. eof();
}
__END__



Ce script efface tres bien les 288 premières lignes du fichier!

Merci à toi lami20j !! :D

Répondre à phoenix1984
Collection CommentÇaMarche.net