Как сделать многострочный поиск и заменить скриптом?

Я пытаюсь заменить каждый многострочный импорт внутри исходного файла 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? Стоит ли пытаться использовать другой инструмент? ?

15.12.2008 10:58:32
всегда ли 2 токена после 'import' или они переменные?
Gishu 15.12.2008 11:12:16
Мне было интересно, если это можно сделать с помощью одного рег-экс :)
Gishu 15.12.2008 11:50:29
Они переменные .. Извините, я
Joril 15.12.2008 12:32:05
3 ОТВЕТА
РЕШЕНИЕ

Ммм ... что не так с 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()
1
15.12.2008 11:04:52
Не в каждой системе он установлен? Многие машины, на которых я работаю, конечно же, этого не делают.
GodEater 15.12.2008 11:41:07
Брайан, так как он хочет изменить исходный файл python, можно поспорить, что у него есть доступ к некоторой машине с установленным python :)
Svante 15.12.2008 11:45:46
С Python все отлично :) Я пробовал с sed, потому что он выглядел как правильный инструмент для этой задачи :)
Joril 15.12.2008 12:35:32
@Joril: Sed сложно использовать (как вы заметили). Таким образом, это не действительно правильный инструмент для задачи, не так ли?
S.Lott 15.12.2008 13:52:17
Ну, было бы, если бы у него была поддержка не жадного сопоставления :) Но я этого не знал X-)
Joril 15.12.2008 14:03:21

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

lineIter = ITER (AFile)
для aLine в lineIter:
    s = aLine.strip ()
    если s.startswith ("from") и s.endswith ("("):
        complete = s [: - 1]
        для модуля в lineIter:
            m = aModule.strip ()
            если m.endswith (")"):
                перемена
            полная + = m.strip ()
        печать завершена
    еще:
        распечатать aLine,
1
15.12.2008 13:06:01

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

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...
2
22.12.2011 16:40:26