我有一个最初为 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>
解决的,这很有趣,因为我没有包括它。
我需要做的是执行以下操作:
<小时/>在我的所有源文件中查找(忽略
.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/