在Vim的每一行中第n次出现之前放置文本

时间:2014-03-15 07:42:58

标签: regex vim

我有像

这样的情况
something 'text' something 'moretext'

我忘记在第一次创建此文件时添加更多间距,现在在每行上我应该在第'次出现之前放置一些空格。

现在我无法为此构建正则表达式。

我知道:

  • 我的命令应以:%s开头,因为我希望它能在所有行上执行
  • 我应该使用{2}运算符来选择第二次出现?
  • 如果我的正则表达式符合我可以在&
  • 匹配之前放入的内容

对我来说,主要的问题是如何使用'表示法构建正则表达式来匹配第二个{},这是令人沮丧的,因为我不应该插入它应该插入或者我应该使用vim中的魔法或非魔法正则表达式。

我正在寻找的结果

something 'text ' something 'moretext'

3 个答案:

答案 0 :(得分:2)

您可以使用

:%s:\v(^[^']*'[^']*)':\1 ':
  • [^']表示除'
  • 以外的所有内容
  • \1是对第一个捕获的群组的反向引用 (...)

基本上你在这里做的是捕捉到第二个引用的所有内容,并用你已捕获的内容,空格和引号替换该引用的行(包括)。

答案 1 :(得分:2)

{2}并不意味着“第二场比赛”,它意味着“两场比赛”,因此这项任务完全没用。

你可以在Robin的回答中使用像这样的一个替换:

:%s/[^']*'[^']*\zs'/ '

或者你可以使用这样的东西:

:g/ '[^']*' /norm 2f'i<space>

答案 2 :(得分:1)

另一种方法:

:%s/\v%([^']*\zs\ze'){2}/ /

注意:我使用非常神奇的\v来减少转义量。

此方法使用\zs\ze来设置匹配的开始和结束。由于量词\zs\ze{2}多次设置,但每次出现的组都会更改\zs\ze位置。

如需更多帮助,请参阅:

:h /\zs
:h /\v

当然总有sed,但诀窍是让报价正确转义。

:%!sed -e 's/'\''/ &/2'