1

Pythonソースファイル内のすべての複数行インポートを置き換えようとしています..したがって、ソースは次のようになります

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

そして、私は次のようなものを手に入れたいです

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

sed を使用しようとしましたが、閉じ括弧の非貪欲な一致をサポートしていないように見えるため、2 番目のインポートを「食べます」.. :(
ヒントはありますか?これは sed では不可能ですか?別のツールで試す必要があります?

4

3 に答える 3

2

これはあなたのために働くかもしれません:

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...
于 2011-12-22T16:40:26.160 に答える
1

後世のために、これはS.Lottのスクリプトのやや洗練されたバージョンです(コメントとして投稿しましたが、長すぎます^^;)。このバージョンはインデントを保持し、私の例に近い結果を生成します。

lineIter = iter(aFile)
lineIterのaLineの場合:
    s = aLine.strip()
    s.startswith( "from")およびs.endswith( "(")の場合:
        完了=s[:-1]
        lineIterのaModuleの場合:
            m = aModule.strip()
            m.endswith( ")")の場合:
                壊す
            完全な+=m.strip()
        印刷完了
    そうしないと:
        aLineを印刷し、
于 2008-12-15T13:06:01.333 に答える
1

うーん... 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()
于 2008-12-15T11:04:52.513 に答える