регулярное выражение с отрицательным соответствием (т. е. найти строку, которая _не_ соответствует регулярному выражению)

У меня есть файл журнала со строкой «ОШИБКА» в некоторых строках. Я хочу удалить каждую строку, в которой нет ошибки ERROR, чтобы увидеть, что нужно исправить. Я собирался сделать что-то вроде следующего в vim:

%s/!(ОШИБКА)//

заменить строки без ошибок пустой строкой.

Я не верю, что стандартные регулярные выражения могут это сделать, но, возможно, я ошибаюсь...


person Alexander Bird    schedule 22.07.2009    source источник


Ответы (5)


Используйте команду :g!, чтобы удалить каждую строку, которая не соответствует.

:g!/ERROR/d
person too much php    schedule 22.07.2009
comment
:v/ERROR/d эквивалентно - person rampion; 22.07.2009

В vim вы можете запустить любую команду фильтра для текста в буфере. Например,

:%!grep ERROR

заменит весь буфер только теми строками, которые соответствуют заданному регулярному выражению.

Это полезно не только для grep, например, вы можете сортировать строки в буфере с помощью :%!sort. Или вы можете сделать то же самое для любого диапазона текста, используя команду V, чтобы пометить блок, а затем :!filter-command (vim автоматически заполнит '<,'>, чтобы вы указали текущий отмеченный блок).

person Greg Hewgill    schedule 22.07.2009
comment
+1 за команду, которая не требует выхода из vim/перенаправления в другой файл - person too much php; 22.07.2009
comment
Возможно, это не лучший пример, так как :grep и :sort имеют встроенные значения в Vim (которые отличаются от :!grep и :!sort, просто чтобы сбить с толку). - person ephemient; 05.04.2010

если на *nix, вы можете использовать grep -v или awk

awk '!/ERROR/' file | more 

на машине с Windows вы можете использовать findstr

findstr /v /c:ERROR file | more
person ghostdog74    schedule 22.07.2009

Использование отрицательного просмотра сработало.

person Alexander Bird    schedule 05.04.2010
comment
Не очень полезный ответ без примера: :%s/^\(\ERROR\)\@!$\n//g. В Vim \@! является индикатором отрицательного прогноза, а не форматом (?!) из этой ссылки. Однако ответ :g! проще. - person atomicules; 09.02.2011
comment
Я согласен с @atomicules, но, тем не менее, я поддерживаю ответ Александра, потому что «отрицательный взгляд вперед» является полезным термином для дальнейшего поиска в Интернете. - person Michael Scheper; 14.12.2012

Регулярное выражение с отрицательным соответствием будет использовать ^, например. [^E] будет соответствовать всему, кроме E.

person Jaelebi    schedule 22.07.2009
comment
Это правда, но такое регулярное выражение будет соответствовать каждому символу, отличному от E, что отличается от сопоставления всех строк, не содержащих E. Кроме того, такое отрицательное совпадение неудобно. выйти за пределы одного символа. - person Greg Hewgill; 22.07.2009