Blog de benji1000

Script Perl pour modifier un fichier

Le 3 janvier 2012 dans Informatique

J'ai régulièrement des modifications précises à faire sur un fichier. Par exemple, en téléchargeant mes sous-titres au format .ass, j'aime bien modifier la police, mettre en gras, enlever certains caractères tels que œ... Bref, jusqu'à présent je le faisais manuellement et c'était casse-couilles.

J'ai donc fait un petit script Perl qui permet, en déposant mon fichier source sur l’icône du script, de modifier automatiquement certaines choses (à l'aide des expressions rationnelles (regexp) ).

Le script Perl

Commençons par télécharger et installer le compilateur Perl. Il en existe deux éditions : celle d'Active State, et celle nommée "Strawberry". Nous allons choisir la première : télécharger Perl.

On va ouvrir le fichier passé au script en entrée, sauvegarder tout son contenu dans un tableau, et refermer ce fichier :

open(FILE_IN,$ARGV[0]);
my @contenu = <FILE_IN>;
close(FILE_IN); 

À présent, ré-ouvrons ce fichier, mais cette fois-ci avec un mode d'écriture : on viendra remplacer tout ce qui se trouve dans le fichier. Nous allons balayer ligne par ligne le tableau que nous avons rempli (@contenu), faire nos petites modifs, et tout enregistrer dans le fichier de départ :

open(FILE_OUT,">$ARGV[0]");
foreach my $ligne (@contenu) { 
    #Vos modifications
    chomp $ligne;
    print FILE_OUT "$ligne\n";
}
close(FILE_OUT); 

Il ne manque donc "plus qu'à" faire les modifications. Utilisons pour cela les expressions régulières/rationnelles. C'est un gros morceau, en informatique, souvent considéré comme une notion complexe, mais essentielle à beaucoup de choses. Voilà la base :

$ligne =~ s/expression_a_remplacer/expression de remplacement/g; 

Le symbole =~ lie la variable $ligne à l'expression qui se trouve après. Le s avant les slash indique que l'on va procéder à une substitution, de l'expression à remplacer (entre les deux premiers slash) par l'expression de remplacement (entre les deux derniers slash). Enfin, le g de la fin signifie que l'on va effectuer ce remplacement pour toutes les occurrences du document.

Prenons un exemple :

$ligne =~ s/Internet Explorer/Mozilla Firefox/g; 

Phrase d'entrée : J'aime Internet Explorer.
Phrase de sortie : J'aime Mozilla Firefox.

Pour en savoir plus sur les expressions régulières/rationnelles : lien 1, lien 2, lien 3.

Le script complet :

#!/usr/bin/perl

open(FILE_IN,$ARGV[0]);
my @contenu = <FILE_IN>;
close(FILE_IN);

open(FILE_OUT,">$ARGV[0]");
foreach my $ligne (@contenu) {
    $ligne =~ s/Arial/Myriad Pro/g;
    $ligne =~ s/œ/oe/g;
    chomp $ligne;
    print FILE_OUT "$ligne\n";
}
close(FILE_OUT);

Le fichier Batch

Tout va bien, à un détail près : si vous essayer de déposer un fichier texte sur l’icône du script par cliquer-déposer de la souris, vous verrez que ça ne fonctionne pas. Il faut donc passer par un fichier batch (.cmd ou .bat) qui se composera de cette unique ligne :

perl nom_du_script_perl.pl %1

Placez les deux scripts dans le même dossier, et voilà ! Déposez un fichier sur le fichier batch : il prend ce fichier (grâce à %1 qui indique le premier argument), le transmet au script Perl, qui fait son office, et enregistre automatiquement les modifications dans votre fichier d'origine.