【问题标题】:Bulk replacing function name with another in C在 C 中用另一个函数名批量替换函数名
【发布时间】:2014-05-11 16:12:16
【问题描述】:

如何使用标准工具/脚本将 C 函数名称替换为另一个名称:shell/awk/grep/python 等?

例如我需要在整个代码库中盲目地将assert(a>b) 语句替换为MyAssert(a>b)。只需要替换函数名。

【问题讨论】:

  • 你希望它有多小心? printf("No assert() here\n");? /* assert that the world is good! */?
  • 这里可以替换“No assert()\n”。但是不能替换像“断言世界是美好的!”这样的非功能文本。 .我需要函数名替换,而不用接触同名的非函数文本。
  • 好的;这是相当理智的。并且大概您想在函数名称和左括号之间使用一个或多个空格来处理assert (space < open_parenthesis),但不关心assert /* Nonsense */ (paranoia != insanity);,因为没有人在他们的正常头脑中使用函数名称和开括号之间的 cmets 编写代码括号。
  • @JonathanLeffler assert 不是宏吗?所以插入评论会阻止它的调用。
  • @luserdroog:在评估宏时会删除注释,因此宏名称及其左括号之间的 cmets 不会影响宏的调用。

标签: python c shell text awk


【解决方案1】:

您可以使用sed

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

【讨论】:

  • 我认为你可以通过不匹配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(/" {} \;

【讨论】:

  • 我发现test_assertion() 变成test_MyAssertion() 存在问题。
  • 修复正则表达式需要更复杂的问题,例如,将其更改为“s/assert(/MyAssert(/g”),这将捕获'assert(',因此不会影响test_assertion . 理想情况下,您希望检查 a 之前的字符,但随后开始变得复杂。如果添加 '(' 适合您,那是最简单的。
【解决方案3】:

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

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

  • 您可以对其进行调整,使其仅查看与模式匹配的文件名(如 *.c 或其他)。

Replace strings in files by Python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多