如何使用以下标准工具/脚本替换另一个C函数名称:shell
/awk
/grep
/python
etc?批量替换C中的另一个函数名称
例如,我需要在整个代码库中盲目地用MyAssert(a>b)
代替assert(a>b)
语句。只有功能名称需要替换。
如何使用以下标准工具/脚本替换另一个C函数名称:shell
/awk
/grep
/python
etc?批量替换C中的另一个函数名称
例如,我需要在整个代码库中盲目地用MyAssert(a>b)
代替assert(a>b)
语句。只有功能名称需要替换。
您可以使用sed
sed -r 's/\bassert\(a>b\)\b/MyAssert(a>b)/' file
\b
查找单词边界,使它看起来精确匹配。-i
选项在现有文件中就地进行更改。我想你可以通过不匹配'a> b'或左括号来简化代码 - 这是一个例子。但是,如果你的'sed'支持用'\ b'扩展正则表达式,这很好。至少,它确保只有自己的单词'assert'被翻译,而不是像'test_assertion()'这样的单词。 –
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(/" {} \;
我看到'test_assertion()'成为'test_MyAssertion()'的问题。 –
要修正正则表达式需要更复杂,例如,将其更改为“s/assert(/ MyAssert(/ g”,它会捕获'assert(',因此不会影响test_assertion。理想情况下,您希望在a之前检查角色,但随后开始变得复杂。如果添加'('适合你,那是最简单的。 – OldGeeksGuide
我编写了一个Python脚本来解决这个问题。好东西:
它不修改任何不包含字符串的文件。时间戳不会改变,除非文件实际被修改。
你可以调整它只看文件名匹配的模式(如*.c
或其他)。
如何小心你希望它是什么? 'printf(“No assert()here \ n”);'? '/ *断言世界是好的! * /'? –
可以在这里替换“No assert()\ n”。但是不能取代一个非功能性文本,比如“断言世界是好的!” 。我需要更换函数名称,而不用触摸具有相同名称的非函数文本。好吧; –
好的;这是理智的。可能你想要在函数名和左括号之间使用一个或多个空格来处理'assert(space