
Des codes sources perlConsultez toutes les FAQ
Nombre d'auteurs : 13, nombre de questions : 59, dernière mise à jour : 27 mai 2011
Sommaire
→
Quelques unilignes perl
→
Traitements de fichiers- Comment supprimer les ^M dans un fichier pour le rendre compatible Unix/Mac/Linux/Windows ?
- Comment supprimer les lignes doublons dans un fichier ?
- Comment effectuer des remplacements dans un fichier ?
- Comment afficher des colonnes particulières depuis un fichier de type csv (tableau texte) ?
- Comment inverser tous les octets d'un fichier ?
7.1.1. Insertion de lignes dans un fichier
(6)
- Insérer une ligne dans un fichier, à une position donnée
- Insérer une ligne dans un fichier, avant chaque ligne correspondant à une regex
- Insérer une ligne dans un fichier, après chaque ligne correspondant à une regex
- Insérer une ligne dans un fichier, après la n-ième ligne correspondant à une regex
- Insérer une ligne dans un fichier en plusieurs positions
- Insérer une ligne dans un fichier, après certaines occurrences de lignes correspondant à une regex



Ce code vous permettra de convertir un fichier plat DOS en UNIX en convertissant les retours chariots vers le format unix. Cela permet de
supprimer les ^M dans un fichier Mac par exemple. Cela est également pratique pour les fichiers transferés en FTP en mode binaire au lieu de ASCII.
C'est léquivalent d'un dos2unix.
perl -pi.bak -e "s/\r\n/\n/" mon_fichier.txt
Ce code fait une sauvegarde préalable du fichier et supprime les ^M de mon_fichier.txt.
perl -pi -e "s/\r\n/\n/" mon_fichier.txt
Fait la même chose sans sauvegarde.

Attention : bien qu'efficace, cette méthode est consommatrice de mémoire si vous l'appliquez sur un très gros fichier
car ce dernier est entièrement chargé en mémoire.
perl -ne "print if ! $lignes{$_}++" mon_fichier.txt > nouveau_fichier.txt
perl -ne 'print if ! $lignes{$_}++' mon_fichier.txt > nouveau_fichier.txt



Il peut être utilise d'avoir une petite commande perl permettant de modifier un mot dans un fichier.
Cet uniligne est là pour ça. Dans l'exemple ci-dessous, nous changeons le nom de domaine yahoo.fr par developpez.com dans un fichier XML.
<annuaire>
<personne>
<nom>Philou</nom>
<prenom>Jean-Francois</prenom>
<telephone>01234567890</telephone>
<email>toto@yahoo.fr</email>
</personne>
<personne>
<nom>Dupont</nom>
<prenom>Paul</prenom>
<telephone>09876543210</telephone>
<email>titi@yahoo.fr</email>
</personne>
</annuaire>
perl -pi.sauvegarde -e "s/yahoo\.fr/developpez\.com/g" annuaire.xml
perl -ne "chomp; print join qq{ }, @{[ split /;/ ]}[8,0],$/" fichier.csv
perl -ne 'chomp; print join qq{ }, @{[ split /;/ ]}[8,0],$/' fichier.csv


Dans ce code, l'expression régulière du split constitue le séparateur de colonne du fichier d'entrée passé en paramètre (le retour à la ligne est considéré comme le séparateur de ligne).
Les colonnes affichées dans l'exemple sont les colonnes d'indice 8 et 0, dans cet ordre. Elles sont affichées avec le paramètre du join comme séparateur.
col0;col1;col2;col3;col4;col5;col6;col7;col8;col9;col10
test1;test2;test3;test4;test5;test6;test7;test8;test9;test10;test11col8 col0
test9 test1
Il est possible de raccourcir le code via les options -a -F et -l.
perl -laF';' -ne "print join q( ), @F[8,0]" fichier.csv
perl -laF';' -ne 'print join qq( ), @F[8,0]' fichier.csv
Ce code correspond à un code perl complet suivant :
#!/usr/bin/perl
$\ = $/; # option -l
while (<>) { # option -n
chomp $_; # options -l et -n
@F = split /;/; # option -a et -F
print join qq( ), @F[8,0]; # option -e
}
perl -e "print scalar reverse <>" fichier



