Как сделать многострочный поиск и заменить скриптом? - PullRequest
1 голос
/ 15 декабря 2008

Я пытаюсь заменить каждый многострочный импорт в исходном файле 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, но, похоже, он не поддерживает не жадное сопоставление закрывающей скобки, поэтому он "съедает" второй импорт ..: (
Любой намек? Это невозможно с помощью sed? Стоит ли попробовать с другим инструментом?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Это может работать для вас:

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...
1 голос
/ 15 декабря 2008

Для потомков, вот несколько отлаженная версия сценария С. Лотта (я бы разместил его в качестве комментария, но он слишком длинный ^^;) .. Эта версия сохраняет отступ и выдает результат, более близкий к моему примеру .

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,
1 голос
/ 15 декабря 2008

Ммм ... что не так с 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()
...