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

发布于 2024-12-02 11:28:32 字数 483 浏览 2 评论 0原文

我想递归地遍历一个目录,并找到至少具有以下一组函数调用之一的所有文件:

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(...) 中。 将不胜感激任何帮助!提前致谢!

I would like to traverse a directory recursively and find all files that have at least one of the function calls of the following set:

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

now, disregarding the arguments I can get a list of such files with

grep -r -l '[A-C](' .

although I am sure I can also match the arguments somehow. On these files I want to do the following: First, I want a backup, i.e. save the original file to filename.ext_bak or something, whereas in the filename.ext I want to replace each occurence of the function call

X(a,...) 

by

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

where X can be A,B,C and notice that each argument in X_new is wrapped in a function f(...).
Would appreciate any help! Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情何以堪。 2024-12-09 11:28:32

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

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

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)

This uses os.walk to traverse all files recursively (starting from the current working directory).

The backup='_bak' argument tells fileinput.input to make a backup of each file.

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)
随风而去 2024-12-09 11:28:32
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";
   }
' {} +

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

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";
   }
' {} +

Makes a lot of assumptions. Let me know if one of them produces too many problems.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文