如何用内容替换一个函数

时间:2017-07-05 17:15:50

标签: regex bash shell vim preg-replace

如何替换所有出现的

check_free_set_to_null(&pointer)

if (pointer)
{
    free(pointer)
    printf(pointer have been freed)
}
else
{
    printf(pointer couldnt had been freed)
    return (1)
}

// maybe using some sort of

{1} = check_free_set_to_null(CONTENT)

if ({1})
{
    free({1})
    printf({1} have been freed)
}
else
{
    printf({1} couldnt had been freed)
    return (1)
}

我怎么能这样做? (请注意,它不完全是必须替换的,它只是一个例子)我不是在寻找编译器将其解释为多行,我正在寻找修改文件。

1 个答案:

答案 0 :(得分:2)

基本上你怎么说,除了......

这是其中一个问题,其中正确的答案可能是"以下是如何做你要求做的愚蠢的事情,但请真的告诉我们你的真正问题是什么,你正试图解决,因为这几乎肯定不是正确的方法。"

首先,搜索字符串应该是(这是为了vim,因为我看到了标签vim。如果你想使用其他替换正则表达式的东西,让我们知道哪个.Perl,php,sed,awk,the bash命令行,什么?):

:%s/\bcheck_free_set_to_null\(([^()]+)\)/ replacement text goes here /g

假设(可能不正确)函数中没有任何大括号 - 如果可能是这种情况,那么你冒险进入递归正则表达式领域,在这种情况下,你绝对是肯定做错了

您的替换字符串应该是您的方法所包含的内容 - 在您的示例中,它应该是:

:%s/\bcheck_free_set_to_null(\([^()]+\))/if (\1)\n{\n    free(\1)\n    printf("freed")\n}\nelse\n{\n    printf("could not free")\n    return (\1)\n}/g

我们在这里使用\ n作为行结尾,因为你正在使用vi,所以你可能会使用某种unix,这就是他们的行结尾的方式

现在,我们可以在这里改进一件事。缩进。

:%s/\(\s+\)\(.*\)\bcheck_free_set_to_null(\([^()]+\))/\1\2if (\3)\n\1{\n\1    free(\3)\n\1    printf("freed")\n\1}\nelse\n{\n\1    printf("could not free")\n\1    return (\3)\n\1}/g

在这里,我将缩进抓取到\1,将其他所有内容抓到\2,将方法参数抓到\3。这可能会让你有点漂亮。

但是,无论你在这里做什么,都可能是错误的做法。告诉我们真正的问题是什么!不要这样修理它!这种方式很糟糕!这种方式有祸根和祸根!而且,对于你来说,我们还有很多东西!