В Vim я часто нахожу, что меня интересуют только строки, содержащие определенную строку текста, и я хочу удалить все остальные строки.
Это легко сопоставить строки, содержащие строку:
:s/^.*foo.*\n//
Обычно я делаю два прохода, один из которых "помечает" все нужные мне строки специальным первым символом:
:s/^\(.*foo.*\)$/X\1/
И во втором проходе легко сделать отрицательное совпадение для одного символа в фиксированной позиции, поэтому я удаляю все строки без моей строки таким образом:
:s/^[^X].*\n//
Но разве не существует более простого способа сделать это всего за один проход? Что мне не хватает?