134 liens privés
Une introduction aux expressions régulières par Timo. Il y a aussi quelques liens en bas de son article qui peuvent servir. :-)
Un aide-mémoire sur les expressions régulières.
Sed fait partie des commandes un peu "légendaires" du monde GNU/Linux. Celle qu'on se doit de maitriser pour être pris au sérieux. ;-)
Et je n'ai pas souvent eu l'occasion de l'utiliser... J'en profite que j'ai un gros fichier de plusieurs milliers de ligne que je veux nettoyer pour insérer dans une DB pour le faire.
Les types de lignes qui existent dans mon fichier :
- lignes vides
- lignes de "commentaires"
- lignes avec un "tag"
- lignes avec un "tag" + commentaire.
Je veux récupérer uniquement une liste de tags bien propre. Tous les tags commencent par une chaine précise (exemple: "AZFDEB").
La commande globale :
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt | grep AZFDEB | sed -e 's/#.$//' | sed 's/^.AZF/AZF/' > fichier_clean.txt
| ========
Un peu plus de détails. On commence par utiliser "cat" pour afficher le fichier.
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt
| ========
On fait ensuite un pipe ( | ) pour envoyer le retour de la commande "cat" à la commande suivante, "grep". La commande "grep" permet de récupérer toutes les lignes où la chaine "AZFDEB" apparait. (Et où il y a donc un tag à isoler.)
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt | grep AZFDEB
| ========
On continue avec la commande "sed" pour effacer les commentaires. On peut utiliser la fonction de substitution et les expressions régulières ( miam! ) pour effacer tous les commentaires. (Pour l'expression régulière, on cherche une chaine qui commence par # et fini à la fin de la ligne ($) avec n'importe quoi entre les deux (.). On remplace par rien...)
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt | grep AZFDEB | sed 's/#.$//'
| ========
J'utilise encore un sed pour retirer les tabulations et/ou espaces avant le tag :
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt | grep AZFDEB | sed -e 's/#.$//' | sed 's/^.AZF/AZF/'
| ========
Et on écrit le résultat dans un fichier :
| ========
| simon@ordi:~/dossier$ cat fichier_bordelique.txt | grep AZFDEB | sed -e 's/#.$//' | sed 's/^.AZF/AZF/' > fichier_clean.txt
| ========
Ça fonctionne ! Par curiosité, j'ai regardé combien de temps toute la commande met à s'exécuter et s'il y a moyen d'optimiser tout ça. Certainement au moins un peu. On peut déjà dire à grep d'aller chercher le fichier tout seul au lieu d'appeler cat. On peut aussi demander à sed d'appliquer les deux fonctions en une seule fois.
| ========
| simon@ordi:~/dossier$ grep AZFDEB fichiers_bordelique.txt | sed -e 's/#.$//' -e 's/^.AZF/AZF/' > fichier_clean.txt
| ========
Il y a certainement moyen de faire encore mieux... Une prochaine fois. :-)