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

sed/regex - Updating source files with scope issues

本文关键字:范围 问题 源文件 regex 更新 sed      更新时间:2023-10-16

我有一个最初为Windows编写的项目,目前正在将其移植到Linux上。大多数特定于平台的代码都经过#ifdef或包装,因此到目前为止很容易。

这个项目有大约 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() -call 的右括号。

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

这个 sed 表达式

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

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