递归遍历目录并替换函数调用

时间:2011-08-31 17:13:46

标签: python perl bash sed grep

我想以递归方式遍历目录并查找至少具有以下一组函数调用的所有文件:

A(a)
B(a,b)
C(a,b,c)

现在,无视参数我可以用

获取这些文件的列表
grep -r -l '[A-C](' .

虽然我确信我也能以某种方式匹配这些论点。在这些文件上,我想要执行以下操作:首先,我想要一个备份,即将原始文件保存到filename.ext_bak或其他东西,而在filename.ext中我想替换函数调用的每个出现

X(a,...) 

通过

#ifdef LOL
   X_new(f(a),...)
#else
   X(a,...)
#endif

其中X可以是A,B,C,并注意到X_new中的每个参数都包含在函数f(...)中。 非常感谢任何帮助!提前谢谢!

2 个答案:

答案 0 :(得分:1)

find -type f -exec perl -i.bak -pe'
   if (my ($orig, $pre, $func, $args, $post) =
       /^((.*)\b(A|B|C)\((.*?)\)(.*?))\n/s
   ) {
       $args = join ', ', map { "f($_)" } split /,\s*/, $args;
       $_ = "#ifdef LOL\n";
       $_ .= $pre${func}_new($args)$post\n";
       $_ .= "#else\n";
       $_ .= $orig\n";
       $_ .= "#endif\n";
   }
' {} +

做了很多假设。如果其中一个产生太多问题,请告诉我。

答案 1 :(得分:1)

这使用os.walk递归遍历所有文件(从当前工作目录开始)。

backup='_bak'参数告诉fileinput.input备份每个文件。

import os
import sys
import re
import fileinput

def sub_callback(match):
    func,args=match.groups()
    fargs=','.join('f({a})'.format(a=a) for a in args.split(','))
    return ('''\
#if def LOL
    {func}_new({fa})        
#else
    {func}({a})
#endif
'''.format(func=func,a=args,fa=fargs))

for root, dirs, files in os.walk('.'):
    for line in fileinput.input(
        (os.path.join(root,name) for name in files),
        inplace=True,
        backup='_bak'
        ):
        line=re.sub(r'\b([A-C])\((.*?)\)',sub_callback,line)
        sys.stdout.write(line)