2008-12-15 15 views
1

Je suis en train de remplacer toutes les importations multiligne dans un fichier source Python .. Donc, la source va commeComment faire une recherche multiligne et le remplacer par un script?

from XXX import (
    AAA, 
    BBB, 
) 
from YYY import (
    CCC, 
    DDD, 
    EEE, 
    ... 
) 
...other instructions... 

et je voudrais obtenir quelque chose comme

from XXX import AAA, BBB 
from YYY import CCC, DDD, EEE, ... 
...other instructions... 

J'ai essayé de utiliser sed mais il semble qu'il ne supporte pas la correspondance non gourmande de la parenthèse de fermeture, donc il "mange" la deuxième importation .. :(
Est-ce impossible avec sed? Devrais-je essayer avec un autre outil?

+0

est toujours là 2 jetons après la « importation » ou sont-ils variables? – Gishu

+0

Je me demandais si cela pourrait être fait via un seul reg-ex :) – Gishu

+0

Ils sont variables .. Désolé, je vais clarifier la question :) – Joril

Répondre

1

Ummm ... qu'est-ce qui ne va pas avec Python?

lineIter= iter(aFile) 
for aLine in lineIter: 
    if aLine.startswith("import"): 
     if aLine.endswith("("): 
      for aModule in lineIter: 
       if aModule.endwith(")"): 
        break 
       print "import", aModule.strip() 
     else: 
      print aLine.stri() 
    else: 
     print aLine.strip() 
+0

Pas tous les systèmes l'a-t-il installé? Beaucoup de machines sur lesquelles je travaille ne le font certainement pas. – GodEater

+0

Bryan, depuis qu'il veut modifier un fichier source python, les paris sont qu'il a accès à une machine avec python installé :) – Svante

+0

Python est parfaitement bien :) J'essayais avec sed car il semblait être le bon outil pour la tâche:) – Joril

1

Pour la postérité, voici une version quelque peu polie du script de S. Lott (je l'aurais posté un commentaire, mais il est trop long ^^;) .. Cette version conserve indentation et produit un résultat plus proche de mon exemple.

 
lineIter=iter(aFile) 
for aLine in lineIter: 
    s = aLine.strip() 
    if s.startswith("from ") and s.endswith("("): 
     complete = s[:-1] 
     for aModule in lineIter: 
      m = aModule.strip() 
      if m.endswith(")"): 
       break 
      complete += m.strip() 
     print complete 
    else: 
     print aLine, 
2

Cela pourrait fonctionner pour vous:

sed '/^from/,/^)/{H;//{x;/)/{s/[\n()]//g;s/ */ /g;s/,$//;p;x}};d}' source 
from XXX import AAA, BBB 
from YYY import CCC, DDD, EEE, ... 
...other instructions...