带负匹配的正则表达式(即查找_doesn't_匹配正则表达式的字符串)

时间:2009-07-22 00:10:12

标签: regex vim vi

我在某些行上有一个字符串为“ERROR”的日志文件。我想删除有错误的每一行,以便我可以看到需要修复的内容。我打算在vim中执行以下操作:

%S /!(ERROR)//

用空字符串替换非错误行。

我不相信标准的正则表达式可以做到这一点,但也许我错了......

5 个答案:

答案 0 :(得分:53)

使用:g!命令删除不匹配的每一行。

:g!/ERROR/d

答案 1 :(得分:8)

在vim中,您可以对缓冲区中的文本运行任何过滤器命令。例如,

:%!grep ERROR

将仅使用与给定正则表达式匹配的行替换整个缓冲区。

这不仅仅适用于grep,例如,您可以使用:%!sort对缓冲区中的行进行排序。或者,您可以使用V命令对任何文本范围执行相同操作以标记块,然后:!filter-command(vim将自动填写'<,'>以指示当前标记的块)。

答案 2 :(得分:1)

如果在* nix上,您可以使用grep -v或awk

awk '!/ERROR/' file | more 
在Windows机器上

,您可以使用findstr

findstr /v /c:ERROR file | more

答案 3 :(得分:1)

使用negative lookahead工作。

答案 4 :(得分:0)

负匹配正则表达式将使用^ 例如。 [^ E]将匹配除E之外的所有内容。