2014
07.16

Un exemple concret de l’utilisation de SED.
Le but est rafraichir une base de données POSTGRES.
Or le seul fichier que j’ai pu obtenir c’est une création de la base à J-1.

Or je ne voudrais pas tout écraser afin d’éviter la perte des données.
Ce qui m’intéresse ici est de récupérer 3 champs pour faire mon update:
– l’id ( unique donc remplacement sûr de la bonne ligne )
– le firstUnit
– le numberOfUnit

Je veux donc remplacer toutes les lignes


INSERT INTO "ConfigurationItem" (id, "alternateTagCI", criticity, type, status, "opMngtCode", description, "usedByAF", "usedByKL", "usedByOther", "assetTag", room, grid, location, sla, cluster, "serviceManager", "siteOwner", scope, "firstUnit", "numberOfUnits", model, "afficherDansRacktable", domain, manufacturer, "serialNumber") VALUES (‘AF4646604’, NULL, ‘1’, ‘LXSRV’, ‘IN OPERATION’, NULL, NULL, false, false, false, ‘TLSPBDN7’, ‘5’, ‘C17’, ‘B1256’, NULL, NULL, NULL, NULL, NULL, 7, 2, ‘POWEREDGE R710’, true, NULL, ‘DELL’, ‘DZNRR4J’);

Par
update "ConfigurationItem" set "firstUnit"= 7,"numberOfUnits"=2 where id=‘AF4646604’;

Et voilà ce que cela donne en sed :

sed ‘s/.*VALUES..\([^,]*\),\([^,]*,\)\{18\}\([^,]*\),\([^,]*\),.*/update "ConfigurationItem" set "firstUnit"=\3,"numberOfUnits"=\4 where id=\1;/’

ou encore

sed -r ‘s/.*VALUES..([^,]*),([^,]*,){18}([^,]*),([^,]*),.*/update "ConfigurationItem" set "firstUnit"=\3,&#34numberOfUnits"=\4 where id=\1;/’ toto2 >toto3

Une petite explication :

Mon sed remplace donc les chaines par d’autres.
C’est l’option s/je_cherche/je_remplace/.

Le but de mon sed est de décomposer ma ligne pour récupérer les éléments id, firstUnit et numberOfUnit, et les réagencer dans un nouveau texte.

1. Ou se cache mes éléments?

A. Après le mot VALUES (

Les éléments que je souhaite récupérer sont dans mon texte après le mot VALUES (.
Mon premier découpage est alors

.* -> n’importe quelle chaîne de caracteres
VALUES -> ma chaine VALUES
.. -> 2 caractères qui dans mon cas sont (

Nous avons donc pour commencer .*VALUES..

INSERT INTO "ConfigurationItem" (id, "alternateTagCI", criticity, type, status, "opMngtCode", description, "usedByAF", "usedByKL", "usedByOther", "assetTag", room, grid, location, sla, cluster, "serviceManager", "siteOwner", scope, "firstUnit", "numberOfUnits", model, "afficherDansRacktable", domain, manufacturer, "serialNumber") VALUES (‘AF4646604’, NULL, ‘1’, ‘LXSRV’, ‘IN OPERATION’, NULL, NULL, false, false, false, ‘TLSPBDN7’, ‘5’, ‘C17’, ‘B1256’, NULL, NULL, NULL, NULL, NULL, 7, 2, ‘POWEREDGE R710’, true, NULL, ‘DELL’, ‘DZNRR4J’);

B. 1er élément

Voici donc ce qui reste de ma chaîne
‘AF4646604’, NULL, ‘1’, ‘LXSRV’, ‘IN OPERATION’, NULL, NULL, false, false, false, ‘TLSPBDN7’, ‘5’, ‘C17’, ‘B1256’, NULL, NULL, NULL, NULL, NULL, 7, 2, ‘POWEREDGE R710’, true, NULL, ‘DELL’, ‘DZNRR4J’);
Je veux récupérer le premier élément. On va nommer ces éléments des champs.

Un champ est défini de la sorte : succession de caractère sauf virgule
CE qui en expression régulière devient [^,]*

Mais je veux pouvoir le garder, pour le réutiliser dans la 2nde partie. Je l’entoure donc de parenthèses et j’ajout une virgule.
1er champ : ([^,]*),

C. 2eme et 3eme element

Je veux ensuite récupérer les 20eme et 21eme champs.
Je vais donc aller 18 champs plus loin pour arriver au champ n°19 : ([^,]*,){18}.
Je veux les 2 champs suivants ([^,]*),([^,]*),

D. Fin de ma ligne

Fin de ma ligne
et pour être sûr , je finis par .*

Nous avons donc au final notre 1ere partie du sed qui équivaut à :
.*VALUES..([^,]*),([^,]*,){18}([^,]*),([^,]*),.*

2.Qu’est ce que j’affiche ?

Je souhaite afficher :
update "ConfigurationItem" set firstUnit=MonChamp2,numberOfUnits=monchamp3 where id=MonChamp1
Il suffit de remplacer champ1 champ2 champ3 par \1 \2 \3 … enfin presque , car il y a des champs que j’ai créé ( sisi souvenez-vous, un champ est créé lorsqu’il est entre ( ) ! ) .
Donc ([^,]*,){18} est un champ que je ne vais pas réutilisé. C’est la champ n°2.
Donc du coup, mon remplacement devient
update "ConfigurationItem" set firstUnit=\3,numberOfUnits=\4 where id=\1

et donc en rassemblant tout ça :

s/.*VALUES..([^,]*),([^,]*,){18}([^,]*),([^,]*),.*/update "ConfigurationItem" set firstUnit=\3,numberOfUnits=\4 where id=\3/

C’est si évident ….

Aucun commentaire.

Ajoutez votre commentaire

%d blogueurs aiment cette page :