Видаліть рядки, що не містять слова у Vim [дублікат]


2

На це питання вже є відповідь тут:

У Vim мені часто здається, що мене цікавлять лише рядки, що містять певний рядок тексту, і хочу видалити всі інші рядки.

Зрівняти рядки, що містять рядок, легко:

:s/^.*foo.*\n//

Зазвичай я роблю два проходи, один, щоб "позначити" всі потрібні рядки спеціальним першим символом:

:s/^\(.*foo.*\)$/X\1/

А у другому проході легко виконати негативну відповідність одному символу у фіксованій позиції, тому я видаляю всі рядки без рядка таким чином:

:s/^[^X].*\n//

Але чи не існує набагато простішого способу зробити це лише одним проходом? Що я пропускаю?


Я думаю, що про це питали раніше, незважаючи на те, що я його не знайшов у той час: vim видалити всі рядки, які НЕ містять певного слова
hippietrail

Відповіді:


9

Це видалить усі рядки, які не містять foo.

:g/^\(.*foo\)\@!.*$/d

Натомість ви також можете використати, :vщоб змінити сенс моделі пошуку.

:v/\(foo\)/d

Більше про спосіб :gта :vроботу ви можете прочитати тут .

І більше про визначення діапазонів, використання метахарактерів тощо для пошуку та заміни тут .


Здається, :gце одна з дуже багатьох команд vim, про які я ніколи не вчився - дякую! (-:
hippietrail

Чому \(і \)?
Бернхард

1
+, ?, |, {, }, (, І )повинні бути екрановані , щоб використовувати їх спеціальні функції.
abhshkdz

Я використовую :gі :vбагато. Якщо з якихось причин :vне наклеїти, ви можете використовувати :g!.
romainl

0

Добре, якщо ваша мета полягає лише в тому, щоб видалити рядки з текстом, це можна легко зробити з awk так:

awk '/regex/{print}' filename

Значення awk діятиме на ім’я файлу. Ви можете передати його на нове ім'я файлу або те саме ім'я файлу, як це -

   awk '/regex/{print}' filename > filename.tmp && mv filename.tmp filename

У той час як у мене встановлено vim на кожній платформі, яку я використовую, у мене зазвичай є awk лише тоді, коли я перебуваю на * nix. Останнім часом я в основному на Windows. Тому я шукаю відповідь на основі вим. Спасибі, хоча.
hippietrail

Я щойно зрозумів, що моє початкове рішення не буде працювати ... тож якщо ти все використовуєш, ти повинен робити це так!
Кітчі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.