Рекурсивно перемещать каталог и заменять вызовы функций

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

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

теперь, невзирая на аргументы, я могу получить список таких файлов с

 grep -r -l '[AC](' . 

хотя я уверен, что могу как-то соответствовать аргументам. В этих файлах я хочу сделать следующее: во-первых, я хочу создать резервную копию, то есть сохранить исходный файл в filename.ext_bak или что-то в этом роде, тогда как в файле filename.ext я хочу заменить каждое появление вызова функции

 X(a,...) 

от

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

где X может быть A, B, C и заметить, что каждый аргумент в X_new завернут в функцию f (…). Поблагодарили бы за любую помощь! Заранее спасибо!

3 Solutions collect form web for “Рекурсивно перемещать каталог и заменять вызовы функций”

Это использует 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([AC])\((.*?)\)',sub_callback,line) sys.stdout.write(line) 
 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"; } ' {} + 

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

Возможно, вы захотите изучить awk. Я не говорю, что sed не может этого сделать, но он может оказаться немного более чистым и более управляемым.

Учебник Awk

  • удаление расширений в подкаталогах
  • Python или awk / sed для очистки данных
  • обрезать большой файл журнала
  • Удаление дубликатов PCR из файла Fastq, содержащего уникальные молекулярные идентификаторы
  • Python - используя подпроцесс для вызова sed?
  • Как случайным образом удалить несколько строк из большого файла?
  • Сравните 2 файла и удалите любые строки в файле2, когда они соответствуют значениям, найденным в файле1
  • Правильный способ избежать вызова подпроцесса в python
  •  
    Interesting Posts for Van-Lav

    что является форматом записи python по умолчанию

    Вычисление изменения в процентах между двумя числами (Python)

    как использовать Content_type, video / mp2t в ответе на http?

    python Неблокированный файл чтения

    Webapp2 для аутентификации и входа в систему

    остановить python в терминале на mac

    Как эта функция позволяет удалить повторяющиеся символы из строки в python?

    Найти ближайший float в массиве для всех поплавков в другом массиве

    Что именно содержится в obj .__ clos__?

    Различия между Jython и Python

    Разница между «и» (логическая) и «&» (побитовая) в python. Почему разница в поведении со списками против массивов numpy?

    Есть ли известная ошибка Win32 Tkinter в отношении отображения фотографий на холсте?

    Почему мы должны использовать методы __dunder__ вместо операторов при вызове через супер?

    Каков правильный способ использования django-allauth с tastypie?

    Ошибка 193% 1 не является допустимым приложением Win32

    Python - лучший язык программирования в мире.