2014-04-01 42 views
2

如何使用以下标准工具/脚本替换另一个C函数名称:shell/awk/grep/python etc?批量替换C中的另一个函数名称

例如,我需要在整个代码库中盲目地用MyAssert(a>b)代替assert(a>b)语句。只有功能名称需要替换。

+1

如何小心你希望它是什么? 'printf(“No assert()here \ n”);'? '/ *断言世界是好的! * /'? –

+0

可以在这里替换“No assert()\ n”。但是不能取代一个非功能性文本,比如“断言世界是好的!” 。我需要更换函数名称,而不用触摸具有相同名称的非函数文本。好吧; –

+1

好的;这是理智的。可能你想要在函数名和左括号之间使用一个或多个空格来处理'assert(space

回答

3

您可以使用sed

sed -r 's/\bassert\(a>b\)\b/MyAssert(a>b)/' file 
  • \b查找单词边界,使它看起来精确匹配。
  • 这将打印文件到STDOUT,您可以重定向到另一个文件或使用-i选项在现有文件中就地进行更改。
+1

我想你可以通过不匹配'a> b'或左括号来简化代码 - 这是一个例子。但是,如果你的'sed'支持用'\ b'扩展正则表达式,这很好。至少,它确保只有自己的单词'assert'被翻译,而不是像'test_assertion()'这样的单词。 –

2
find . -iname "*.c" -exec sed -i.bak "s/assert/MyAssert/g" {} \; 

这将更改应用于各个.c文件来取代当前目录下,并创建包含原始一个.c.bak文件。如果你想摆脱这些,你可以用这个删除:

find . -iname "*.bak" -exec rm {} \; 

当然,要确保你有所有内容的副本第一,我可能会搞砸:-)

如果您想更仔细地追赶的情况下,避免了在另一个单词中间“断言”,但得到它在一行的开头,但它开始变得难看了,仍然是不完美:

find . -iname "*.c" -exec sed -i.bak -e "s/\([^a-zA-Z0-9S]\)assert(/\1MyAssert(/g" -e "s/^assert(/MyAssert(/" {} \; 
+0

我看到'test_assertion()'成为'test_MyAssertion()'的问题。 –

+0

要修正正则表达式需要更复杂,例如,将其更改为“s/assert(/ MyAssert(/ g”,它会捕获'assert(',因此不会影响test_assertion。理想情况下,您希望在a之前检查角色,但随后开始变得复杂。如果添加'('适合你,那是最简单的。 – OldGeeksGuide

1

我编写了一个Python脚本来解决这个问题。好东西:

  • 它不修改任何不包含字符串的文件。时间戳不会改变,除非文件实际被修改。

  • 你可以调整它只看文件名匹配的模式(如*.c或其他)。

Replace strings in files by Python