Des codes sources perlConsultez toutes les FAQ
Nombre d'auteurs : 13, nombre de questions : 59, dernière mise à jour : 27 mai 2011
- 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;test11
col8 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