Supprimer une ligne d'1 fichier, perl

Fermé
medmans - 23 oct. 2007 à 21:39
 josephtux - 13 juil. 2013 à 20:58
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
A voir également:

1 réponse

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
23 oct. 2007 à 23:18
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
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