Cómo hacer una búsqueda de varias líneas y reemplazar con un guión?
-
21-08-2019 - |
Pregunta
Estoy tratando de reemplazar cada importación de varias líneas dentro de un archivo fuente de Python .. Por lo tanto, la fuente va como
from XXX import (
AAA,
BBB,
)
from YYY import (
CCC,
DDD,
EEE,
...
)
...other instructions...
y me gustaría conseguir algo como
from XXX import AAA, BBB
from YYY import CCC, DDD, EEE, ...
...other instructions...
He intentado usar sed, pero parece que no es compatible con juego no expansivo del paréntesis de cierre, por lo que "come" la segunda importación .. :(
Cualquier pista? Es imposible con esta sed? Debería tratar con otra herramienta?
Solución
Ummm ... ¿qué pasa con 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()
Otros consejos
Esto podría funcionar para usted:
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...
Para la posteridad, aquí es una versión algo pulida del guión de S. Lott (Me hubiera publicado como un comentario, pero es demasiado larga ^^;) .. Esta versión conserva la sangría y produce un resultado más cerca de mi ejemplo .
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,