Vim: как удалить каждую вторую строку? - PullRequest
84 голосов
/ 22 декабря 2009

Как это сделать в Vim:

ДО:

aaa
bbb
ccc
ddd
eee
fff

ПОСЛЕ:

aaa
ccc
eee

Ответы [ 12 ]

236 голосов
/ 01 декабря 2011

Элегантный (и эффективный) способ решения этой задачи заключается в выдаче :+delete команда, удаляющая строку рядом с текущей, в каждой строке используя команду :global.

:g/^/+d
95 голосов
/ 22 декабря 2009

Вы можете использовать макрос для этого. Сделайте следующее.

  • Запуск в командном режиме.
  • Перейти к началу файла, нажав gg.
  • Нажмите qq.
  • Нажмите стрелку вниз и нажмите dd после.
  • Нажмите q.
  • Нажмите 10000@q

PS: чтобы перейти в командный режим, просто нажмите Escape пару раз.

61 голосов
/ 01 декабря 2011

Мы можем использовать :normal или :norm для выполнения заданных команд нормального режима. Источник.

:%norm jdd
10 голосов
/ 22 декабря 2009
:map ^o ddj^o
^o

Здесь ^ обозначает CTRL. Рекурсивный макрос для удаления строки каждые две строки. Хорошо выберите свою первую строку, и все готово.

7 голосов
/ 22 декабря 2009

из почтовый архив vim :

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(вводится в одной строке в командной строке vim, удаляет строки 1,3,5,7, ...)

5 голосов
/ 22 декабря 2009

Вы всегда можете передать через команду оболочки, что означает, что вы можете использовать любой язык сценариев, который вам нравится:

:%!perl -nle 'print if $. % 2'

(или использовать «если» вместо «если», в зависимости от того, какие строки вы хотите)

4 голосов
/ 22 декабря 2009
:%!awk -- '++c\%2'

альтернативно

:%!awk -- 'c++\%2'

в зависимости от того, какую половину вы хотите отсеять.

3 голосов
/ 23 июня 2013

В качестве другого подхода вы также можете использовать python, если ваш vim поддерживает его.

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:] временно копирует все строки в текущем буфере в b. b[::2] получает каждую вторую строку из буфера и присваивает ее всему текущему буферу cb[:]. Копия в b необходима, поскольку объекты буфера, похоже, не поддерживают расширенный синтаксис слайса.

Это, вероятно, не "vim way", но его легче запомнить, если вы знаете python.

3 голосов
/ 22 декабря 2009

Вы можете использовать собственные возможности поиска и замены Vim, например: Наведите курсор на первую строку и введите в обычном режиме:

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • .,/fff/ - это диапазон для замены. Это означает «от этой строки до строки, которая соответствует регулярному выражению fff (в данном случае последняя строка).
  • s/// - команда замены. Он ищет регулярное выражение и заменяет каждое его вхождение на строку. g в конце означает повторение замены до тех пор, пока регулярное выражение будет найдено.
  • Регулярное выражение \n.*\(\n.*\) соответствует новой строке, затем целой строке (.* соответствует любому количеству символов, кроме новой строки), затем другой новой строке и другой строке. Скобки \( и \) приводят к записи выражения внутри них, поэтому мы можем использовать его позже, используя \1.
  • \1 вставляет сгруппированную новую строку и строку после нее, потому что мы не хотим, чтобы и следующая строка была пропущена - мы просто хотим, чтобы механизм подстановки проходил мимо, поэтому мы не удаляем ее при следующей замене .

Таким образом, вы можете контролировать диапазон, в котором вы хотите, чтобы удаление происходило, и вам не нужно использовать какой-либо внешний инструмент.

3 голосов
/ 22 декабря 2009

Вы должны быть в состоянии использовать макрос:

http://www.oreillynet.com/mac/blog/2006/07/more_vim_save_time_with_macros_1.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...