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 ! :)