gpt4 book ai didi

c++ - sed/regex - 更新具有范围问题的源文件

转载 作者:行者123 更新时间:2023-11-30 18:37:50 24 4
gpt4 key购买 nike

我有一个最初为 Windows 编写的项目,目前正在将其移植到 Linux。大多数平台特定代码已 #ifdef 'ed 或wrapped,所以到目前为止很容易。

该项目大约有 2000 个 gettext() 实例分散在大约 200 个源文件中( .cpp.c 编译为 C++)。预期的函数调用是:

std::string boost::locale::gettext(const char*);

这在 Windows 中有效,但在 Linux 版本中,它解析为:

char * gettext (const char * msgid);

我认为它是从 <libintl.h> 解决的,这很有趣,因为我没有包括它。

我需要做的是执行以下操作:

<小时/>
  1. 在我的所有源文件中查找(忽略 .svn 目录):

    1.1。包含 gettext(.*).c_str() 的行并修改为boost::locale::gettext(.*).c_str() .

    1.2。包含 gettext(.*) 的行并修改为boost::locale::gettext(.*).c_str() .

<小时/>

完成此操作的最佳方法是什么,最好使用 BASh 和 sed,或者一般的一些命令行 fu? 1.1的要求我可能可以很容易地做到,但是 1.2有点复杂,我不知道如何让它知道哪个右括号 )追加.c_str()正确。

谢谢。

最佳答案

在一般情况下,此问题无法使用正则表达式解决,因为如果其他调用嵌套在其参数列表中,则无法找到与它相匹配的 gettext() 调用的右括号。

但是,如果通常不进行嵌套调用,则可以选择自动修复这些情况并手动完成其余的操作。

这个 sed 表达式

 sed -r "s/gettext\(([^()]*)\)(\.c_str\(\))?/boost::locale::gettext(\1).c_str()/g"

应该保留嵌套调用的调用不变,并替换其余的。

关于c++ - sed/regex - 更新具有范围问题的源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35730957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com