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

Résolu
titexe Messages postés 55 Statut Membre -  
 phoenix1984 -
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

9 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    3
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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]$
    ;-))
    1
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1
    1. phoenix1984
       
      Merci bien pour ta réponse, comme toujours aussi rapide et sympa !

      bonne journée !
      0
    2. phoenix1984
       
      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 !
      0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Au lieu de for mets if
    1
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. phoenix1984
     
    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
    1
  7. phoenix1984
     
    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 ! :)
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Les 288 lignes se trouve où, au début ou à la fin de fichier?
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    0
  10. phoenix1984
     
    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 :)
    0