Remplacements en Vim
Par Cédric Tabin le vendredi 19.06.2009, 12:00 - Autre - Lien permanent
Un de mes collègues (fan de Linux lui aussi) a du effectuer un remplacement assez avancé dans un fichier SQL comprenant beaucoup de tables. Comme quoi la puissance de vi(m) n'est plus à démontrer !
Le but est simple : dans un fichier SQL (dont le code d'une table est représenté ci-dessous), remplacer la chaîne PRIMARY_123 par PRIMARY_NOMTABLE.
CREATE TABLE "SAI2"."TSTDOM" ( "DOMAINPK" VARCHAR2(10 CHAR) DEFAULT ' ' NOT NULL , "KEYPK" VARCHAR2(2 CHAR) DEFAULT ' ' NOT NULL , "LIBELL" VARCHAR2(10 CHAR) DEFAULT ' ' NULL , "EDMSDESCRIPTOR" CLOB NULL , CONSTRAINT "PRIMARY_123" PRIMARY KEY ("DOMAINPK", "KEYPK") ) ORGANIZATION INDEX OVERFLOW;
Dans vim, il 'suffit' de taper la commande suivante :
:%s/CREATE TABLE "SAI2"."\(.*\)"\_.\{-}PRIMARY_\zs.\{-}\ze"\_.\{-}ORGANIZATION/\1/
Voici les explications en ce qui concerne le pattern de commande ci-dessus :
- %s/ : remplacer dans tout le fichier
- "\(.*\)" : groupe sur le nom de la table
- \_ : prise en compte du mutliligne par le '.' (préfixe)
- .\{-} : "shortest match", équivalent de la RegExp .*?
- \zs : début de la zone de remplacement
- \ze : fin de la zone de remplacement
- /\1/ : remplacer par le groupe 1 (nom de la table)
Le résultat est le suivant :
CREATE TABLE "SAI2"."TSTDOM" ( "DOMAINPK" VARCHAR2(10 CHAR) DEFAULT ' ' NOT NULL , "KEYPK" VARCHAR2(2 CHAR) DEFAULT ' ' NOT NULL , "LIBELL" VARCHAR2(10 CHAR) DEFAULT ' ' NULL , "EDMSDESCRIPTOR" CLOB NULL , CONSTRAINT "PRIMARY_TSTDOM" PRIMARY KEY ("DOMAINPK", "KEYPK") ) ORGANIZATION INDEX OVERFLOW;
Encore merci à Michel Ganguin pour le mini-tuto !