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

标签 c++ c regex linux sed

我有一个最初为 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/

相关文章:

c++ - 限制字段​​突变/访问命名空间

c++ - 运行可执行文件不会执行任何操作

c - 在声明期间定义结构变量

javascript - 0 或 x - y 字符的正则表达式

java - 使用 OpenGL 将网格移动到给定位置

c++ - 范围界定错误并且不能有 cv 限定符?

.net - 在正则表达式中使用 Ascii 代码作为左引号

javascript - 在 JS 的字符串中按字符类反转字符串

c - 在 C 中使用带有数组的循环

c - 面向初学者的 OpenMP