Domanda

che sto cercando di sostituire ogni importazione più righe all'interno di un file sorgente Python .. Così, la fonte va come

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

e mi piacerebbe ottenere qualcosa di simile

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

Ho cercato di usare sed ma sembra che non supporta corrispondenza non avido della parentesi di chiusura, in modo che "mangia" la seconda importazione .. :(
Qualsiasi suggerimento? È questo impossibile con sed? Dovrei provare con un altro strumento?

È stato utile?

Soluzione

Ummm ... cosa c'è di sbagliato 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()

Altri suggerimenti

Questo potrebbe funzionare per voi:

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

Ai posteri, qui è una versione un po lucidata della sceneggiatura di S. Lott (avrei postato come commento, ma è troppo lungo ^^;) .. Questa versione conserva l'indentazione e produce un risultato più vicino al mio esempio .

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,
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top