vim:用行

时间:2016-04-06 15:42:41

标签: vim

问题
我有一个看起来像这样的文件:

  

字=某事aaa something aaa
  word2 =东西aaa something aaa
  word3 =某事aaa aaa

请注意,“某事”并不一定就是同一个词。 “东西”和“aaa”也不一定用白色空格分隔。

问题
我想用vim中的第一个单词替换所有出现的“aaa”。输出应如下所示:

  

字=东西字东西字   word2 =某事word2是word2
  word3 =某事word3是word3

到目前为止,我主要研究了vim的搜索和替换语法,因为这是我最熟悉的。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

:s命令适用于您的示例:

%s/\<aaa\>/\=substitute(getline('.'),'^[^=]*\zs=.*','','')/g

答案 1 :(得分:2)

对于完全使用正则表达式的解决方案,我建议:

:%s/\v%(^([^=]+).*)@<=aaa/\1/g

这适用于宽度为零的后面(\@<=)。 \v at 正则表达式的开始只是通过启用“非常”来简化转义 魔术“模式(见:h \v)。表达本身:

%(^([^=]+).*)@<=aaa

背后的外观与第一组一起运作。 %()表单是非表单 捕获组(更快一点,并且不会算作编号中的一个 代换)。内部组捕获任何不等号的东西,和 在此组之后,任何内容都匹配(.*)。所有这一切都没有计算在内 在正则表达式中,真正匹配的是aaa,但它只是。{ 如果在这些条件之前匹配。当然之前是 他们,但目标是捕捉第一个词。

然后,此aaa被捕获的组替换多次 一行(g标志)和所有行(%范围)。