2008-12-15 9 views
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, но похоже, что он не поддерживает неживое соответствие закрывающей круглой скобки, поэтому он «ест» второй импорт .. :(
Любой намек? Это невозможно с sed? Должен ли я попробовать с другим инструментом?

+0

есть всегда 2 лексемы после «импорта», или они переменные? – Gishu 2008-12-15 11:12:16

+0

Мне было интересно, можно ли это сделать через один reg-ex :) – Gishu 2008-12-15 11:50:29

ответ

1

Ummm ... что с 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

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

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