使用正则表达式进行Vim搜索

时间:2015-06-22 08:37:44

标签: regex vim

我想搜索一个以" abc"开头的字符串并以" xyz"结束在vim。

以下是我尝试过的命令:

:1,$g/abc[\w\W]*xyz/
:1,$g/abc\[\\w\\W\]\*xyz/
:1,$g/abc*xyz/

" [\ W \ W] *"是指" abc"之间的文本。和" xyz"可以是任何字符

" 1,$"表示搜索范围是由vim打开的文件中的第1行到最后一行。

我发现了搜索模式

abc[\w\W]*xyz 

适用于https://regex101.com/

为什么它在vim中失败?

4 个答案:

答案 0 :(得分:17)

下面的命令应该有效,除非“任何字符”对你来说意味着与Vim不同的东西:

:g/abc.*xyz
  • .表示“除EOL之外的任何角色”。
  • *表示“前一个原子的任何数字(包括0)”。
  • 1,$可以缩短为%
  • 默认情况下,
  • :global适用于整个缓冲区,因此您甚至不需要%
  • 如果您不按照/中的命令关注:g/pattern,则不需要结束:g/foo/d

答案 1 :(得分:2)

一旦文件太大(比如1GB),“:g / abc。* xyz”变得非常慢。

我找到了

cat fileName | grep abc | grep xyz >> searchResult.txt

比在vim中使用搜索功能更有效。

我知道这个方法可能会返回以“xyz”开头并以“abc”结尾的行。

但是因为这在我的档案中是罕见的情况(也许这对其他人来说不常发生),我想我应该在这里写这个方法。

答案 2 :(得分:0)

似乎在集合语法[..]中,字符类如\ w can't be used,可能是因为它通过逐字符策略进行测试。来自:h /[]

  

与集合匹配可能会很慢,因为每个字符都在         必须将文本与集合中的每个字符进行比较。         尽可能使用上面的其他原子之一。示例:“\ d”是         比“[0-9]”快得多,并匹配相同的字符。

但是,您可以使用专门为[..]语法准备的类似功能。再次从:h /[]开始:

  

将字符类表达式计算为字符集         属于那个角色类。

示例包括:

[:alnum:]     letters and digits                   
[:alpha:]     letters                              
[:blank:]     space and tab characters             
[:cntrl:]     control characters                   
[:digit:]     decimal digits                       
[:graph:]     printable characters excluding space 
[:lower:]     lowercase letters

答案 3 :(得分:0)

如果要一一找到它们,可以点击

/

然后写

abc.*xyz

,然后按Enter键以找到图案的第一个出现。然后将n用于下一个事件,将Shift + n用于前一个事件。这是我通常的做法,因为对我来说,修改这些行更容易。