Script de modification de texte en masse

mysql

On vous a fourni un dump MySQL avec le nom de toutes les tables en minuscule, alors que le joli projet qui doit l'utiliser réclame le nom des tables avec des majuscules de ci, de là.

L'idée de modifier le tout manuellement étant une très mauvaise idée, on va donc automatiser un peu le processus.

Problématique

Nous avons donc un dump sql (nommé dump_base.sql) contenant des noms de tables tout en minuscule :

admcoef
admcorrections
admglobalmodifications
admglobal
admloadedqueries

Et notre programme nous demande des noms de tables avec ces noms :

admCoef
admCorrections
admGlobalModifications
admGlobal
admLoadedQueries

Résolution

Principe

Nous allons construire une commande sed qui va se charger d'effectuer les modifications à nos noms de tables dans notre fichier de dump MySQL.

Pour cela, on va :

  • Extraire le nom des tables du fichier de dump pour se constituer un dictionnaire ;
  • Modifier notre dictionnaire pour mettre les majuscules aux bons endroits ;
  • Utiliser ce dictionnaire pour la modification de notre dump.

Extraction du nom des tables

On construit notre dictionnaire grâce à la commande suivante :

awk -F\` '/^CREATE TABLE/{print $2,$2}' dump_base.sql > dictionnaire.txt

Cette commande va nous créer un fichier texte dans lequel le nom des tables sera doublé :

admcoef admcoef
admcorrections admcorrections
admglobalmodifications admglobalmodifications
admglobal admglobal
admloadedqueries admloadedqueries

Modification du dictionnaire

Avec notre joli éditeur de texte préféré, on modifie le fichier du dictionnaire pour avoir sur chaque ligne le nom de la table provenant du fichier dump ainsi que le nom de la table que l'on souhaite avoir.

Les deux noms séparés par un espace :

admcoef admCoef
admcorrections admCorrections
admglobalmodifications admGlobalModifications
admglobal admGlobal
admloadedqueries admLoadedQueries

Construction de notre commande de modification

On va utiliser la commande awk qui va se charger de parcourir notre fichier dictionnaire et nous créer une commande de remplacement sed qui va se charger d'effectuer toutes les modifications nécessaires dans notre dump Mysql.

awk -F " " 'BEGIN {print "sed -i \""} { print "s/" $1 "/" $2 "/g;" } END {print "\" dump_base.sql"}' dictionnaire.txt

 

Dans notre exemple, le résultat de cette commande sera :

sed -i "
s/admcoef/admCoef/g;
s/admcorrections/admCorrections/g;
s/admglobalmodifications/admGlobalModifications/g;
s/admglobal/admGlobal/g;
s/admloadedqueries/admLoadedQueries/g;
" dump_base.sql

Il ne reste plus qu'a lancer cette commande pour que les tables de notre fichier de dump soient valides.

Précaution

Il faut faire attention à l'ordre des tables dans le fichier dictionnaire.

Étant donnée que la commande sed générée va appliquer les modifications l'une après l'autre de manière globale dans le fichier de dump, si un nom de table est contenu dans une autre, l'ordre est important.

Dans notre exemple, nous avons deux tables de ce type admGlobalModifications et admGlobal

Si notre fichier dictionnaire est comme ceci :

admcoef admCoef
admcorrections admCorrections
admglobal admGlobal
admglobalmodifications admGlobalModifications
admloadedqueries admLoadedQueries

Le résultat final sera incorrect pour la table admGlobalModifications car la modification pour la table admGlobal aura été effectuée précédemment.

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Enregistrer

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.