Vim:如何在整个文件中删除相同的文本块

时间:2014-04-18 15:12:41

标签: vim editor vi

我正在查看一些带有Java异常垃圾邮件的日志。垃圾邮件越来越难以看到其他错误。

在vim中可以使用可视模式选择文本块。删除该块在文件中出现的每个位置。

如果vim无法做到,我知道愚蠢的问题,vim可以做任何事情。还有哪些其他Unix工具可以做到?

4 个答案:

答案 0 :(得分:3)

听起来好像在寻找:global命令

:g/pattern/d

:global命令采用:g/{pat}/{cmd}形式。在每个匹配模式的行{cmd}上读取它:run命令{pat}

您甚至可以为:delete(简称:d)命令提供范围。示例:

:,+3d
:,/end_pattern/d

使用:global命令放置此对象,您可以完成一堆。例如:g/pat/,/end_pat/d

如需更多帮助,请参阅:

:h :g
:h :d
:h :range

答案 1 :(得分:2)

的Vim

删除所有匹配的行:

:g/regex/d

仅删除匹配项:

:%s/regex//g

在任何一种情况下,您都可以通过yanking将视觉选择复制到命令行,然后使用<C-r>"插入它。例如,如果光标(|)的位置如下:

hello wo|rld

然后,您可以使用world选择viw,使用y,然后:g/<C-r>"/d来挑选选区。

SED

删除所有匹配的行:

$ sed '/regex/d' file

仅删除匹配项:

$ sed 's/regex//g' file

的grep

删除所有匹配的行:

$ grep -v 'regex' file

grep只能按行操作,因此不可能只删除行内的匹配。

答案 2 :(得分:1)

你可以在vim中试试这个

:g/yourText/ d

答案 3 :(得分:1)

根据我们在评论中的讨论,我猜一个&#34;块&#34;意味着几条完整的线。如果第一行和最后一行是独特的,那么您在注释中提供的方法应该有效。 (&#34; distinct&#34;我的意思是这些行不会出现在日志文件中的任何其他位置。)

为简化起见,我会使用"ay$将第一行拉入注册a"by$,将最后一行拉入注册b,而不是使用可视模式。 (我打算建议"ayy"byy,但是这会抓住新行)

为了安全起见,我会锚定模式:/^{text}$/以防日志文件包含类似&#34的行;注意{text}标记Java异常的开始。&# 34;在命令行中,我会使用<C-R>a<C-R>b粘贴两个寄存器的内容,如您所建议的那样。

:g/^<C-R>a$/,/^<C-R>b$/d

如果抽出的文字包含对搜索模式有特殊含义的字符,该怎么办?为了确保安全,我会使用\V(非常非魔法)修饰符并转义任何斜杠和反斜杠:

:g/\V\^<C-R>=escape(@a, '/\')<CR>\$/,/\V\^<C-R>=escape(@b, '/\')<CR>\$/d

请注意<C-R>=会让您进入一个新的命令行,然后返回主<CR>

写matchit时,\V不可用是太糟糕了。它必须以搜索模式处理缓冲区中的文本,就像这样。