4

我正在清理一个大型 C++ 代码库,我需要将“vector”类型的所有变量都更改为“std::vector”。跳过代码中的#include 和注释。最重要的是,如果表达式已经写成“std::vector”,不要将其转换为“std::std::vector”

那是:

#include <vector>
vector<Foo> foolist;
typedef vector<Foo> FooListType;
std::vector<Foo> otherfoolist;
int main()
{
    // this vector is for iteration
    for (vector <Foo>::iterator itor = foo.begin...)

转换为

#include <vector>
std::vector<Foo> foolist;
typedef std::vector<Foo> FooListType;
std::vector<Foo> otherfoolist;
int main()
{
    // this vector is for iteration
    for (std::vector<Foo>::iterator itor = foo.begin...)

到目前为止,我已将其范围缩小为两个 sed 命令

sed -r 's/vector\s{0,1}</std::vector</g' < codefile > tmpfile
sed 's/std::std/std/' < tmpfile > codefile

第一个 sed 匹配 "vector< 和 "vector <" 并转换为 "std::vector<"。

第二个 sed 修复了将“std::vector<”转换为“std::std::vector<”的副作用。

如何合并上面的两个不同的正则表达式,这样我就可以有一个正确修复代码的 sed 命令。

我曾尝试在线阅读有关前瞻和后视的信息,但我的眼睛开始燃烧。

4

3 回答 3

3

您可以通过使用使第一个正则表达式也匹配一个可能std::

sed -r 's/[std:]*vector\s{0,1}</std::vector</' < codefile > tmpfile

顺便说一句:您可以通过添加-i文件并将其作为命令行参数传递来进行更改:

sed -i -r 's/[std:]*vector\s{0,1}</std::vector</' codefile
于 2012-07-13T04:34:30.090 回答
2

这可能对您有用(GNU sed):

sed -i 's/\(^\|[^<:]\)\(vector\s*<\)/\1std::\2/g' file
于 2012-07-13T05:50:12.693 回答
1

如果你的 sed 版本不支持扩展正则表达式,你可以使用 perl:

perl -lane ' if (!/^\s*#include/) {s!(?:std::)?vector!std::vector!g;} print; ' < codefile > tmpfile

这将在以下情况下起作用: vector<vector<Foo>> otherfoolist;

另请参阅此答案:https ://stackoverflow.com/a/6157705/390913

于 2012-07-13T04:51:11.553 回答