Come fare ricerca multilinea e sostituirlo con uno script?
-
21-08-2019 - |
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?
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,