удалить все, кроме шаблона и следующей строки VIM - PullRequest
0 голосов
/ 09 января 2019

Попытка выяснить, как удалить из vim все, кроме шаблона, используя возможности регулярных выражений.

В частности, я пытаюсь удалить все, кроме строки "United States", а также строки, следующей сразу за ней (из списка зеркал Arch Linux). Так что это ...

## Austria
Server = http://mirror.easyname.at/archlinux/$repo/os/$arch
## United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch
## Thailand
Server = http://mirror2.totbb.net/archlinux/$repo/os/$arch

Должен трансформироваться в это ... (и продолжать это для каждого экземпляра линии Соединенных Штатов)

## United States
Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch

Строка, которую я пытался использовать, чтобы завершить это:

:v/## United States\n\_.\{-}\_$/d

Если я правильно понимаю,: v выбирает все, кроме шаблона. Шаблон, который я пытаюсь передать, это строка Соединенных Штатов плюс следующая строка (\ n) и все, что после этого, до конца строки (\ _. \ {-} \ _ $), а затем удалите весь этот мусор (/d).

Однако при выполнении этой строки я получаю только строки с Соединенными Штатами. Примерно так:

## United States
## United States
## United States
...

Что мне делать, чтобы сохранить строку после строки США?

1 Ответ

0 голосов
/ 09 января 2019

Если я правильно понимаю,: v выбирает все, кроме шаблона. Шаблон, который я пытаюсь подать, это строка Соединенных Штатов плюс следующая строка (\ n) и все, что после этого, до конца строки (\ _. \ {-} \ _ $), а затем удалите весь этот мусор (/d).

Закрыть . Но не совсем. Есть тонкое различие. :v (или :g!) будет запускать определенную команду в каждой строке , которая не соответствует регулярному выражению. Который действительно очень близок к тому, что вы хотите, но не совсем там. Здесь проблема. Линия:

## United States

соответствует вашему регулярному выражению, это правда. Поэтому эта строка не удаляется. Однако линия сразу после этого проверяется, и

Server = http://mirror.cs.pitt.edu/archlinux/$repo/os/$arch

Не соответствует вашему регулярному выражению. Так что он действительно удаляется.

Самое простое решение, которое я могу придумать, - это сопоставить каждую строку местоположения (поэтому ваши строки начинаются с ## <location>) другие , чем ## United States, а затем для каждого из этих совпадений удалите эту строку и следующее. Например:

:g/## \(United States\)\@!/,+1d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...