Рекурсивно пройти каталог и заменить вызовы функций - PullRequest
1 голос
/ 31 августа 2011

Я хотел бы рекурсивно пройти по каталогу и найти все файлы, у которых есть хотя бы один из вызовов функций следующего набора:

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 ]

1 голос
/ 31 августа 2011

Используется 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)
1 голос
/ 31 августа 2011
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";
   }
' {} +

Делает много предположений. Дайте мне знать, если одна из них создаст слишком много проблем.

...