我想搜索一个以" 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
为什么它在vim中失败?
答案 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
用于前一个事件。这是我通常的做法,因为对我来说,修改这些行更容易。