vim命令在关键字出现次数之间进行搜索

0yg35tkg  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(144)

在这个文件里...

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会搜索到关键字的最后一次出现。有没有什么,我们限制搜索的次数?

mrphzbgm

mrphzbgm1#

你可以给予/搜索命令一个计数,这反过来是一个移动命令,你可以给删除d命令:

  • d3/thu-最多删除第三个星期四

注意可能的逐位:如果光标已经在一个thu上,找到第三个thu就是第四个。

bpsygsoo

bpsygsoo2#

为了只匹配一定数量的模式,需要计数以及非贪婪乘数。它们分别记录在:help \{:help non-greedy中。
在Vim中,\{-}(或\{-\})是*的非贪婪表兄弟。在问题的原始regexp中用它替换*将给予thu.\{-}thu,它只匹配两个连续的“thu”和中间的文本。这已经接近解决方案了。
接下来,需要引入一个计数来匹配第三个“thu”。我们还需要使用括号\( ... \)进行分组。regexp thu\(.\{-}thu\)\{2}将匹配一个“thu”后跟组“anything-thu”两次。
下面的两行使用:substitute命令将第一个“thu”替换为第三个“thu”,并将其删除。上面的一行包括定界的“thu”,而下面的一行不包括它们:

:s/thu\(.\{-}thu\)\{2}//
:s/thu\zs\(.\{-}\zethu\)\{2}//

字符串
独占版本使用\zs\ze来界定要操作的匹配的开始和结束,参见:help \zs
所有其他regexp相关操作的文档都可以在Vim中的:help regexp中找到。

**编辑:**在Jens出色的严肃回答旁边,这个答案看起来很臃肿,甚至很滑稽。是的。所以我们在上面再加些文字……

对于一次性操作,请按照Jens的建议使用d3/thu:substitute的强项是在 * 范围 * 上操作,例如:一个视觉选择或整个缓冲区与:%s.在一个大文件的几行上执行删除将更快。这取决于文件。

pcrecxhr

pcrecxhr3#

快速一行程序:

:%s/\v.{-}thu\zs.{-}thu.{-}\zethu//

字符串

  • \v让搜索变得“非常神奇”
  • {-}是lazy repeat,就像其他正则表达式引擎中的*?一样
  • \zs\ze标记比赛的开始和结束

相关问题