如何替换所有出现的
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)
}
我怎么能这样做? (请注意,它不完全是必须替换的,它只是一个例子)我不是在寻找编译器将其解释为多行,我正在寻找修改文件。
答案 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
。这可能会让你有点漂亮。
但是,无论你在这里做什么,都可能是错误的做法。告诉我们真正的问题是什么!不要这样修理它!这种方式很糟糕!这种方式有祸根和祸根!而且,对于你来说,我们还有很多东西!