0

我的任务是在公司重新编译一个遗留的 C++ 项目,在创建一个 32 位 chroot 之后,完成编译依赖项的所有无聊工作等等,我终于发现大多数文件都使用标准的异常类无需添加 'using namespace std' 或在其前面加上 'std::'。

我创建了一个简单的 sed 脚本来批量更改所有文件。但有时替换不是我想要的。我的脚本是这样的:

sed -r 's/(catch.*)[^std::](exception)/\1 std::\2/' File.cpp

但是当我运行它时,我会得到这样的东西(只是替换):

}catch std::exception& e){
}catch(const std::exception& e){
}catch(const std::exception& e){

原来的行是这样的:

}catch(exception& e){
}catch(const exception& e){
}catch(const exception& e){

因此,当 catch 后面跟着“(异常”)时,我遇到了问题,并且当它后面跟着 (const ...) 时它工作正常

我试图通过尝试匹配第一个反向引用表达式中的 ( 即通过将其更改为 "(catch.*\()" 来稍微更改正则表达式,但它仍然不起作用。

任何人都可以帮我解决这个问题吗?

谢谢

4

2 回答 2

1

[^std::]不做你认为它做的事,它匹配一个不是's', 't', 'd', or之一的单个字符':',并且它匹配的任何字符都不会被放回你的替换中,这就是你丢失(字符的原因。另外,我敢打赌,如果您仔细观察,您已经更改catch(const exceptioncatch(const  std::exception额外的空间。

你可能想要:

sed -r 's/(catch.*[^:])(exception)/\1std::\2/' File.cpp
于 2013-01-28T15:54:04.520 回答
1

[^std::]部分是伪造的,因为它匹配不是,或的单个字符,这不是您想要的。相反,您希望跳过包含该零件的所有实例。这对我有用: std:std::exception

sed -r '/catch.*std::exception/!s/(catch.*)(exception)/\1 std::\2/' File.cpp
于 2013-01-28T15:57:14.420 回答