VIM搜索和替换 - 参考

时间:2017-09-21 19:13:31

标签: vim

VIM搜索并替换命令以查找方法字符串的); - 结尾,并替换为以strlcpy函数开头的行的附加参数。

输入

strlcpy(p->account,gettoken(NULL,&plast));      //Set Account Information
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0')); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast));

预期输出(复制第一个参数,即p->account,并将);替换为sizeof(p->account));

strlcpy(p->account,gettoken(NULL,&plast),sizeof(p->account));     //Set Account Information
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0'),sizeof(p->startDate)); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast),sizeof(p->status));

EG。以下命令搜索并替换);

:g/strlcpy(/s/);/,sizeof());/g

 strlcpy(p->balance,getInfo(NULL,&account),sizeof());

如何将p->balance作为参数传递给sizeof()

感谢最早的回复。

2 个答案:

答案 0 :(得分:1)

<强>输入:

strlcpy(p->account,gettoken(NULL,&plast));      //Set Account Information
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0')); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast));

<强>命令:

:%s/\(strlcpy(p->\)\([0-9A-Za-z]*\)\(\,.*))\)/\1\2\3,sizeof(p->\2))/g

<强>输出:

strlcpy(p->account,gettoken(NULL,&plast)),sizeof(p->account));      //Set Account Information
strlcpy(p->startDate,skipchr(gettoken(NULL,&plast),'0')),sizeof(p->startDate)); /* YYYYMMDD */
strlcpy(p->status,gettoken(NULL,&plast)),sizeof(p->status));

注意:

命令在vim内部运行!

答案 1 :(得分:1)

:%s/strlcpy(\(.\{-}\),.*\zs);/, sizeof(\1));

以下是分解的内容:

    所有行
  • %
  • s替换
  • /启动搜索模式
  • strlcpy(匹配strlcpy(
  • \(启动匹配组以捕获稍后要使用的内容
  • .\{-}使用非贪婪乘数\{-}匹配所有字符
  • \)完成比赛组
  • ,强制匹配逗号。结合非贪婪的\{-},这具有选择直到第一个逗号
  • 之前的效果
  • .*匹配所有字符
  • \zs在此之后开始替换
  • );匹配);
  • /启动命令的替换部分
  • , sizeof(\zs之后使用, sizeof(
  • 替换
  • \1使用替换
  • 中上一个匹配组的内容
  • ));使用));
  • 完成替换