我有像
这样的情况something 'text' something 'moretext'
我忘记在第一次创建此文件时添加更多间距,现在在每行上我应该在第'
次出现之前放置一些空格。
现在我无法为此构建正则表达式。
我知道:
:%s
开头,因为我希望它能在所有行上执行{2}
运算符来选择第二次出现?&
对我来说,主要的问题是如何使用'
表示法构建正则表达式来匹配第二个{}
,这是令人沮丧的,因为我不应该插入它应该插入或者我应该使用vim中的魔法或非魔法正则表达式。
我正在寻找的结果
something 'text ' something 'moretext'
答案 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'