与短语匹配的正则表达式,除非它已经加前缀

我正在清理一个大的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< and”vector<“并转换为”std :: vector<“. 第二个sed修复了转换“std :: vector<”的副作用进入“std :: std :: vector<”. 如何合并上面的两个不同的正则表达式,这样我就可以有一个单独的sed命令来正确修复代码. 我曾尝试在线阅读有关前瞻和后视的内容,但我的眼睛开始消失.

解决方法

您可以通过使用使第一个正则表达式也匹配可能的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

相关文章

正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...