mardi 1 mars 2011

Sed 'match parenthesis' : ajouter une chaîne de caractère à en endroit précis

Sed permet de remplacer des chaines de caractères via une expression régulière.

Récemment je devais transformer cette commande SQL

INSERT INTO my_table VALUES (1,'blabal bla'),(2,'bloblo blo'),(3,'blibli bli')"

Par celle ci :

INSERT INTO my_table VALUES (1,'0','blabal bla'),(2,'0','bloblo blo'),(3,'0','blibli bli')


Pour y arriver j'ai utilisé sed, en mode rechercher remplacer sed "s/string-to-replace/new-string/g"

Mais en réalité je n'ai pas de besoin de remplacer une chaîne de caractère mais simplement d'insérer la chaîne suivante ",'0'" à un endroit précis.

Pour cela j'utilise les 'match parenthesis' (je ne sais pas si ça s'appelle vraiment comme ça).

Voici un exemple :

echo "tata, titi, tutu" | sed "s/,\(\w*\)/,'string inserted',\1/g"
tata,'string inserted', titi,'string inserted', tutu

A l'intérieur des parenthèses \( \) (Attention il faut les précédé d'un antislash) je choisi un chaîne particulière.
Ensuite dans la deuxième partie de mon sed je peut injecter cette chaine via \1.


Finalement voici ma commande :

sed "s/(\(\w*\),/(\1,'0',/g" myFile.sql


Et voici le test pour reproduire le cas chez soi:

echo "INSERT INTO my_table VALUES (1,'blabal bla'),(2,'bloblo blo'),(3,'blibli bli')" | sed "s/(\(\w*\),/(\1,'0',/g"
INSERT INTO my_table VALUES (1,'0','blabal bla'),(2,'0','bloblo blo'),(3,'0','blibli bli')

Aucun commentaire:

Enregistrer un commentaire