jeudi 22 janvier 2009
Aujourd'hui, j'ai reçu un fichier de code source de plusieurs centaines de lignes que je devais utiliser mais le programmeur qui me l'a fait parvenir a eu la brillante idée de "formater" le code en y incluant les numéros de lignes.
Pour mieux comprendre, imaginez un fichier source comme celui ci-dessous (ne faites pas attention, j'ai pratiquement fait du pseudo-code pour illustrer le problème). Comme chaque début de ligne incluait son numéro, le code ne pouvait pas être exécuté, à moins de les retirer préalablement.
1 <?phpPour y arriver, j'ai utilisé un moyen simple de faire de la substitution à l'aide de l'outil SED. Sed (Stream EDitor) est un utilitaire Unix qui permet d'analyser et de traiter le contenu de fichiers textes (contrairement à GREP qui ne fait que rechercher à l'intérieur). Il lit le fichier séquentiellement et applique le traitement ligne par ligne selon la commande passée en paramètre dans l'invite de commande.
2 require_once('classes/DBI.php');
3
4 $dbi = new DBI('pgsql');
5 $dbi->connect('server', 'database', 'usr', 'pwd');
6
7 $dbi->execute('SELECT * FROM table ...');
8
9 if ($a == $b) {
10 /* indentation */
11 echo 'OK';
12 }
13
14 ?>
La syntaxe de substitution est la suivante (comme j'utilise UnxUtils sur Windows, je dois mettre des double-quotes) :
sed "s/chercher/remplacer/" inputFile > outputFile
Dans cette requête, on appele l'outil sed en lui spécifiant une commande de substitution (l'option s), autrement dit, le bon vieux "find and replace". Ensuite, on spécifie ce que l'on veut trouver et par quoi on veut le remplacer en les séparant par /.
On spécifiera ce qu'on veut trouver en utilisant une expression régulière. Si on remarque bien, chaque ligne commence par son numéro, suivi de trois ou quatre espaces avant que le code source PHP débute. Notre objectif est de retirer ces caractères en début de ligne et de conserver le reste.
La commande que j'ai utilisé :
sed "s/^[0-9]*[ ]\{3,4\}//" source.txt > resultat.php
Dans la partie "chercher" de la substitution, j'ai défini l'expression régulière :
^[0-9]*[ ]\{3,4\}
Si vous n'êtes pas familier avec les regexp, voici ce que chaque partie représente :
^ au début de la ligneQui sera remplacée dans la deuxième partie de la commande par //, ce qui veut dire par rien (donc on coupe ce qu'on a trouvé et on garde le reste).
[0-9] les caractères de 0 à 9
* répétés plusieurs fois
[ ] suivi du caractère "espace" (il y a un espace à l'intérieur)
{3,4} répétés 3 ou 4 fois
On spécifie ensuite le nom du fichier source et on envoie le résultat en sortie vers un autre fichier à l'aide de l'opérateur > (il sera créé s'il n'existe pas). Notez que > écrase le contenu du fichier tandis que >> ajoute le contenu à sa suite.
Nous voilà donc rendu avec un fichier source PHP qui peut maintenant être exécuté proprement. Mais la prochaine fois, je lui dirai que mon éditeur numérote les lignes automatiquement, alors pas la peine de se donner tant de mal... :-)