我正在查看一些带有Java异常垃圾邮件的日志。垃圾邮件越来越难以看到其他错误。
在vim中可以使用可视模式选择文本块。删除该块在文件中出现的每个位置。
如果vim无法做到,我知道愚蠢的问题,vim可以做任何事情。还有哪些其他Unix工具可以做到?
答案 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)
删除所有匹配的行:
:g/regex/d
仅删除匹配项:
:%s/regex//g
在任何一种情况下,您都可以通过yanking将视觉选择复制到命令行,然后使用<C-r>"
插入它。例如,如果光标(|
)的位置如下:
hello wo|rld
然后,您可以使用world
选择viw
,使用y
,然后:g/<C-r>"/d
来挑选选区。
删除所有匹配的行:
$ sed '/regex/d' file
仅删除匹配项:
$ sed 's/regex//g' file
删除所有匹配的行:
$ 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
不可用是太糟糕了。它必须以搜索模式处理缓冲区中的文本,就像这样。