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?

¿Fue útil?

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,
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top