我有一个任务是在公司里重新编译一个遗留的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。* \()”但稍微更改正则表达式,但它仍然不起作用。
任何人都可以帮我一个忙吗?
由于
答案 0 :(得分:1)
[^std::]
没有按照您的想法执行,它匹配的单个字符不是's'
,'t'
,'d'
或{{1并且它匹配的任何字符都不会被放回到你的替换中,这就是你丢失':'
字符的原因。另外我敢打赌,如果你仔细观察,你已经将(
更改为catch(const exception
并留出了额外的空间。
你可能想要:
catch(const std::exception
答案 1 :(得分:1)
[^std::]
部分是假的,因为它与不 s
,t
,{{匹配的单字符相匹配1}}或d
,这不是你想要的。相反,您希望跳过包含:
部分的所有实例。这对我有用:
std::exception