Supprimer une ligne d'1 fichier, perl

medmans -  
 josephtux -
Bonjour,
je veux supprimer une ligne d'un fichier en PERL mais je ne connais pas comment faire pour supprimer une ligne sans derranger les autre.
chaque ligne est identifiée par ses 6 premiers caracteres.

Si qlq un peut m'aider svp?

Merci d'avance
Configuration: Windows XP
Internet Explorer 7.0

1 réponse

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    voici un exemple en ligne de commande
    lami20j@debian:~/trash$ cat aaa
    ligne1
    ligne2
    ligne3 - a supprimer
    ligne4
    ligne5
    lami20j@debian:~/trash$ perl -pi.orig -e 's/.*//s if 3..3' aaa
    lami20j@debian:~/trash$ cat aaa
    ligne1
    ligne2
    ligne4
    ligne5
    et avec un script
    lami20j@debian:~/trash$ cat ccm.pl
    #!/usr/bin/perl -i.orig
    use strict;use warnings;
    
    while(<>){
        print "$_" unless 3 .. 3;
    }
    __END__
    lami20j@debian:~/trash$ cat aaa
    ligne1
    ligne2
    ligne3 - a supprimer
    ligne4
    ligne5
    
    lami20j@debian:~/trash$ perl ccm.pl aaa
    lami20j@debian:~/trash$ cat aaa
    ligne1
    ligne2
    ligne4
    ligne5
    
    lami20j@debian:~/trash$ cat aaa.orig
    ligne1
    ligne2
    ligne3 - a supprimer
    ligne4
    ligne5
    
    lami20j@debian:~/trash$
    

    l'option -i.orig sers à sauvegarder le fichier original
    0
    1. josephtux
       
      Avec Perl en ligne de commande:

      1 Afficher les 6 premières lignes:
      for i in a* c* ; do echo $i ; perl -E 'while (<>) {say if $. < 6}' $i ; done

      # un peu plus lisible:
      for i in a* c* ; do echo $i ; perl -E 'while (<>) {say "$_" if $. < 6}' $i ; done

      # $. est la variable Perl qui contient le numéro de la ligne en cours.
      # <> donne accès à la ligne suivante du fichier

      2 Supprimer:

      #Supprimer les 36 premières lignes:
      for i in *; do perl -i -e 'while (<>) {print $_ if $. > 36 }' $i ; done

      # Supprimer les lignes reconnues par une regex:

      #Supprimer les lignes vides:
      for i in *; do perl -i -e 'while (<>) {print $_ if $_=~/^\s*$/ }' $i ; done
      ou:
      for i in *; do perl -i -e 'while (<>) { $_=~ s/^\s*$// }' $i ; done

      # idem en sauvegardant l'original avec l'extension <.bak> :
      for i in *; do perl -i.bak -e 'while (<>) { $_=~ s/^\s*$// }' $i ; done

      # Supprimer les commentaires (ATTENTION : et plus les $# et autres !# , plus précisément TOUT ce qui suit le 1er caractère "#" sur la ligne : peaufiner le tri si nécessaire
      for i in *.txt ; do perl -i.bak -e 'while (<>) { $_=~ s/\s*#.*$// }' $i ; done
      0