我有一个最初为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>
解析的,这很有趣,因为我不包括它。
我需要做的是执行以下操作:
在我的所有源文件中查找(忽略
.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"
应保持对嵌套调用的调用不变,并替换其余调用。