在这个文件里...
thu klfjakldsjfkasd f thu jsdklfjkaldsfj thu fjklasdjflasdjf thu jfkasjdklfasd thu
thu uiuor kdsjfkasd f thu nmdasnf asdhfj thu lopieqrefd sdjf thu heyqewf lfasd thu
字符串
...我想删除第1个“thu”到第3个“thu”之间的内容。有人能帮忙找出这样做的命令吗?
在vim中,thu.*thu
会搜索到关键字的最后一次出现。有没有什么,我们限制搜索的次数?
3条答案
按热度按时间mrphzbgm1#
你可以给予
/
搜索命令一个计数,这反过来是一个移动命令,你可以给删除d
命令:d3/thu
-最多删除第三个星期四注意可能的逐位:如果光标已经在一个thu上,找到第三个thu就是第四个。
bpsygsoo2#
为了只匹配一定数量的模式,需要计数以及非贪婪乘数。它们分别记录在
:help \{
和:help non-greedy
中。在Vim中,
\{-}
(或\{-\}
)是*
的非贪婪表兄弟。在问题的原始regexp中用它替换*
将给予thu.\{-}thu
,它只匹配两个连续的“thu”和中间的文本。这已经接近解决方案了。接下来,需要引入一个计数来匹配第三个“thu”。我们还需要使用括号
\( ... \)
进行分组。regexpthu\(.\{-}thu\)\{2}
将匹配一个“thu”后跟组“anything-thu”两次。下面的两行使用
:substitute
命令将第一个“thu”替换为第三个“thu”,并将其删除。上面的一行包括定界的“thu”,而下面的一行不包括它们:字符串
独占版本使用
\zs
和\ze
来界定要操作的匹配的开始和结束,参见:help \zs
。所有其他regexp相关操作的文档都可以在Vim中的
:help regexp
中找到。**编辑:**在Jens出色的严肃回答旁边,这个答案看起来很臃肿,甚至很滑稽。是的。所以我们在上面再加些文字……
对于一次性操作,请按照Jens的建议使用
d3/thu
。:substitute
的强项是在 * 范围 * 上操作,例如:一个视觉选择或整个缓冲区与:%s
.在一个大文件的几行上执行删除将更快。这取决于文件。pcrecxhr3#
快速一行程序:
字符串
\v
让搜索变得“非常神奇”{-}
是lazy repeat,就像其他正则表达式引擎中的*?
一样\zs
\ze
标记比赛的开始和结束