在vi编辑器中搜索字符串并获取计数

124

我想在使用vi编辑器时,在文件中搜索字符串并找出其出现次数。


13
所选答案(:g/xxxx/d) 糟糕、危险,比此页面上其他选项都要劣。请取消选择该答案。 - Bruno Bronosky
1
我同意,它只告诉你“删除了行”,而不是“删除了出现次数”。 - user1709076
8个回答

221

替换命令的语法是

:%s/模式/替换文本/标志


2
这是最真实的答案,没有使用任何过度的技巧。 - user1412066
2
最佳答案! - Paulo Luvisoto
如果我想搜索的模式中间有空格怎么办? - Kartik Podugu

126
你需要使用n标志。要计算单词数,请使用:

You need the n flag. To count words use:


:%s/\i\+/&/gn   

一个特定的单词:

:%s/the/&/gn        

参见count-items文档章节。

如果您只是简单地输入:

%s/pattern/pattern/g

在 vi 中,状态行将告诉您匹配项的数量。


看起来这个答案是给Vim用户而不是Vi用户的 :( - kadeshpa
你的系统上只有vi吗?是哪个版本? - dirkgently
有人在你的问题中标记了vim...我已经将其删除。 - ojblass

43

:%s/string/string/g将会得到答案。


什么更好的答案。如果可能,+5。 - ojblass
我猜只有在模式中没有使用“.*”时才能起作用。 - A. K.
11
无需重复该字符串,只需执行 %s/string//ng - slm

26

(与Gustavo所说的类似,但另外还有:)

对于任何以前的搜索,您只需简单地执行以下操作:

:%s///gn

不需要模式,因为它已经在搜索寄存器(@/)中了。

"%" - 在整个文件中进行 s/ 操作
"g" - 全局搜索(一行中有多个匹配项)
"n" - 防止对 s/ 进行任何替换 -- 不会删除任何内容! 无需撤销操作!
(更多信息请参见 :help s_flag

(这种方式完全可以与"查找可视化选定的文本"搭配使用,详见vim-wikia tip171


5

简短回答:

:%s/要搜索的字符串//gn

学习用途:

VI编辑器有以下3种模式 enter image description here

  • :您正在从命令模式进入命令行模式。现在,您在:后面输入的任何内容都在CLI(命令行界面)上。
  • %s指定所有行。将范围指定为%表示在整个文件中进行替换。所有出现次数替换的语法为:%s / old-text / new-text / g
  • g指定行中的所有出现次数。使用g标志,您可以使整行被替换。如果不使用此g标志,则仅替换行中的第一个出现。
  • n指定输出出现次数的数量
  • //双斜杠表示省略替换文本。因为我们只想查找。

一旦得到出现次数,您可以按N键逐个查看出现次数。

要查找和计算特定范围内的行号1到10:

:1,10s/hello//gn

  • 请注意,整个文件中的%将被替换为逗号,分隔的行号。

要在特定范围的行号1到10中查找和替换:

:1,10s/helo/hello/gn


3

用法

:%s/模式/\0/g

当模式字符串过长,而你又不愿意再次输入全部内容时使用。


3
:g/xxxx/d

这将删除所有带有模式的行,并报告已删除的数量。撤消操作可以将它们恢复回来。

6
当然,他可以省略掉“d”,这样他就不必撤销那个操作了。 - Rook
15
请注意,这只告诉你有多少行 - 而不是有多少次出现。我认为 Dirk 的解决方案更好。 - anon
4
我下面的解决方案正确地计算了一行内的多次出现,没有需要撤消的内容。 - Mohit Chakraborty
是的,它不会计算出现次数。 - jnthnclrk
对于非常大的文件来说,这可能会非常慢。 - Patrick Oscity
呃,这很丑陋而且危险。 - TZubiri

1

我建议做以下操作:

  1. 使用*进行“有界搜索”来查找光标下的内容,或者使用标准的/pattern搜索。
  2. 使用:%s///gn来获取匹配次数。或者你可以使用:%s///n来获取包含匹配行数的数量。

** 我真的希望能找到一个插件,在每次搜索时都会给出“在N2行中匹配了N1个”的消息,但是可惜没有。

注意: 不要被输出的复杂措辞所困扰。前一条命令可能会给出类似于3行中有4个匹配项的结果,而后一条命令可能会给出3个匹配项的结果。虽然后一种方式从技术上讲是准确的,但它具有误导性,并且应该说成“3行匹配”。因此,正如您所看到的,实际上没有必要使用后一种(仅使用“n”)形式。通过使用“gn”形式,您可以更清晰地获得相同的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接