如何进行多行搜索并用脚本替换?

时间:2008-12-15 10:58:33

标签: linux sed multiline non-greedy

我正在尝试替换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 个答案:

答案 0 :(得分: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...

答案 1 :(得分: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()

答案 2 :(得分:1)

对于后人来说,这是一个有点精致的S.Lott脚本版本(我已将其作为评论发布,但它太长了^^;)..这个版本保留缩进并产生更接近我的例子的结果

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,