Question

Je suis en train de remplacer toutes les importations multiligne dans un fichier source Python .. Donc, la source va comme

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é d'utiliser sed mais il semble que cela ne prend pas en charge l'appariement non gourmande de la parenthèse fermante, il « mange » la deuxième importation .. :(
Tout soupçon? Est-ce impossible avec sed? Dois-je essayer avec un autre outil?

Était-ce utile?

La solution

Hummm ... quel est le problème 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()

Autres conseils

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...

Pour la postérité, voici une version quelque peu polie du script de S. Lott (j'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,
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top