Niveau :      
Résumé : perl -i -pe

La puissance de perl en fait un excellent remplaçant de sed, awk et grep réunis. Il permet de n'apprendre qu'une syntaxe plutôt que 3 et de plus possède des expressions régulières très puissantes.

Je vais tenter de vous convaincre par l'exemple à partir de quelques tâches courantes effectuées habituellement avec ces outils.

Commenter des lignes comme en sed :

$ sed 's/^/#/'
$ perl -pe 's/^/#/'

Formater des lignes comme en awk :

$ awk '{print "$1:$3"}'
$ perl -ne 'split; print "$_[0]:$_[2]\n"'

Sélectionner des lignes comme en grep :

$ grep "^[0-9]"
$ perl -ne 'print if /^[0-9]/'

Perl dispose de l'option -i comme sed. Cette option permet d'éditer les fichiers en ligne. Si un mot est ajouté après -i, le fichier sera sauvegardé.

$ perl -i.bak -pe '$i++; s/^/$i /' file # numérote les lignes du fichier

Tout comme awk, perl supporte l'exécution de code au début et à la fin de la boucle :

# Implémentation de head en perl
$ perl -ne 'BEGIN{$i=10}{print if $i-->0}'
# Implémentation de wc -l en perl
$ perl -ne '{$i++}END{print "$i\n"}'

L'avantage d'utiliser perl est que le jour où vous voulez faire grossir votre script, c'est très simple.

perl -pe '...'
# Devient dans un fichier de script
while(<>) { ... ; print }
perl -ne '...'
# Devient dans un fichier de script
while(<>) { ... }

Par exemple faisons grossir notre wc pour afficher un peu plus de choses :

#!/usr/bin/perl
$char=0;
$word=0;
$line=0;
while(<>)
{
   $char += length;
   split;
   $word += scalar @_;
   $line++;
}
print "$line $word $charn";