Comment faire la recherche multiligne et le remplacer par un script?
-
21-08-2019 - |
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?
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,