2

如何使用 VIM 在文本文件中搜索特定字符串,然后它将输出所有带有搜索字符串实例的行?

请指教。

谢谢!

4

4 回答 4

5

你可以使用 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 函数的脚本。

于 2013-02-24T04:51:27.020 回答
4

还有另一种可能性:g

假设您想使用 word 获取当前文件中的所有行foo

你可以输入:

qzq:g/foo/y Z Enter

执行上述行后,这些行将存储在您的寄存器中z。您可以"zp粘贴到某处,或稍后进行处理。

很快做什么:

qzq: 清除z寄存器

:g/foo/y Z: 抽出所有匹配的行来注册z

于 2013-02-25T00:07:32.567 回答
3

除了: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或任何操作错误列表的命令之前不会改变。这意味着您可以隐藏快速修复窗口并使用相同的列表再次打开它。

于 2013-02-24T08:18:55.927 回答
0

在搜索“qqq”之后,我只看到包含该字符串的行,命令如下:

:v//d

“v”匹配不包含先前搜索的行(“//”)并且“d”删除它们。这是一个否定的“g”。
我只能清楚地看到我想要的线条。如果我对某个特定的感兴趣,我会用“mm”标记它。
当我完成查看它们时,使用“u”撤消删除并取回我的文件(不必忘记)。
之后,我用“n”在这些行之间移动,或者用“'m”转到标记的行。

于 2014-11-24T16:18:17.117 回答