sed/regex - 更新具有范围问题的源文件
sed/regex - Updating source files with scope issues
我有一个最初为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"
应保持对嵌套调用的调用不变,并替换其余调用。
相关文章:
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- 命名空间范围问题
- 断言失败错误,C++中的矢量下标超出范围问题
- 指针范围问题和返回类中封装的指针向量内的指针引用
- PlatformIO 的范围问题(?)
- 无法编译 - 范围问题
- 需要帮助将矢量解决范围问题.C
- 来自 gmock 的默认值的范围问题
- 可能的继承范围问题:
- #pragma警告(disable:XXXX)的行为与预期不符(范围问题)
- OpenGL的范围问题
- C++ 引用变量范围问题
- 内存引用范围问题:变量值被重置,如何将值分配给LPCWSTR
- 矢量范围问题
- sed/regex - 更新具有范围问题的源文件
- C++类和范围问题
- C++ 程序未正确执行,可能是范围问题
- 类范围问题的向量
- 如何创建一个通用指针,它可以处理int和double变量并避免范围问题
- 命名空间别名范围问题