如何使用 VIM 在文本文件中搜索特定字符串,然后它将输出所有带有搜索字符串实例的行?
请指教。
谢谢!
你可以使用 Vim 的内置global
工具。它将在窗口底部输出所有匹配项的行。这方面的一个例子是::g/searchterm/Enter
如果尚未打开行号,您可能会发现打开行号有助于了解匹配项在文件中的位置。执行此操作的命令是::set numberEnter
可以通过运行以下命令找到其他信息::help globalEnter
编辑:
如果要将结果重定向到自己的窗口中,vim.wikia.com
建议使用命令序列
:redir @a redirect output to register a
:g// repeat last global command
:redir END end redirection
:new create new window
:put! a paste register a into new window
您可以很容易地将其编写为 vimscript function
。如果您从未看过Steve Losh - Learn Vimscript the Hard Way教程,我强烈建议您查看它来学习如何正确编写 Vim 函数的脚本。
还有另一种可能性:g
假设您想使用 word 获取当前文件中的所有行foo
:
你可以输入:
qzq:g/foo/y Z
Enter
执行上述行后,这些行将存储在您的寄存器中z
。您可以"zp
粘贴到某处,或稍后进行处理。
很快做什么:
qzq
: 清除z
寄存器
:g/foo/y Z
: 抽出所有匹配的行来注册z
除了:g[lobal]
迈克回答中的命令之外,这里还有几个替代方案:
:il[ist] foo
列出所有包含在当前缓冲区中foo
看起来不像注释:il[ist]!
的行(如果您也想匹配注释,请使用)。
当列表显示时,您可以点击<CR>
使其消失或点击:
发出 Ex 命令::5<CR>
跳转到第 5 行,:5t3
在第 3 行之后复制第 5 行,依此类推。
请注意,该列表是暂时的:如果您想再次查看该列表,则必须重新发出该命令。
用法:
:il foo<CR>
:23<CR>
:vim[grep] bar % | cw[indow]
bar
使用当前缓冲区中包含的所有行填充快速修复窗口。
阅读:h quickfix
以了解如何使用它。快,点击<CR>
跳转到上一个结果,:cn
跳转到下一个结果,:cp
跳转到上一个结果……</p>
用法:
:vim bar % | cw<CR>
(navigate to the result you want in the quickfix window
with arrows, `jk`, line numbers, search…)
<CR>
你也可以使用:grep bar % | cw[indow]
which 使用你的系统grep
而不是 Vim 的内部grep
方法。
:vim
请注意,quickfix 窗口的内容在下一个或:grep
或:make
或任何操作错误列表的命令之前不会改变。这意味着您可以隐藏快速修复窗口并使用相同的列表再次打开它。
在搜索“qqq”之后,我只看到包含该字符串的行,命令如下:
:v//d
“v”匹配不包含先前搜索的行(“//”)并且“d”删除它们。这是一个否定的“g”。
我只能清楚地看到我想要的线条。如果我对某个特定的感兴趣,我会用“mm”标记它。
当我完成查看它们时,使用“u”撤消删除并取回我的文件(不必忘记)。
之后,我用“n”在这些行之间移动,或者用“'m”转到标记的行。