Как это сделать в Vim:
ПЕРЕД:
aaa
bbb
ccc
ddd
eee
fff
ПОСЛЕ:
aaa
ccc
eee
Как это сделать в Vim:
ПЕРЕД:
aaa
bbb
ccc
ddd
eee
fff
ПОСЛЕ:
aaa
ccc
eee
Ответы:
Для этого можно использовать макрос. Сделайте следующее.
gg
.qq
.dd
после.q
.10000@q
PS: Чтобы перейти в командный режим, просто нажмите Escape пару раз.
:g/^/+d
от пользователя stackoverflow.com/users/254635/ib (ниже) - более элегантный способ решить эту проблему.
Элегантный (и эффективный) способ выполнить задачу - вызвать :+delete
команду, удаляющую строку, следующую за текущей, в каждой строке с помощью :global
команды:
:g/^/+d
:1d|g/^/+d
удаляет лишние строчки.
Мы можем использовать :normal
или :norm
для выполнения заданных команд нормального режима. Источник.
:%norm jdd
%norm ddj
не работает, если вы хотите удалить нечетные строки.
:map ^o ddj^o
^o
Здесь ^ обозначает CTRL. Рекурсивный макрос для удаления строки каждые две строки. Хорошо выберите первую строчку, и готово.
из почтового архива vim :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(При вводе в одной строке командной строки vim удаляются строки 1,3,5,7, ...)
!perl -ne 'print unless $. % 2'
:-)
if (expression)
которой также работает для каждой третьей строки и т. Д.
Вы всегда можете передать команду оболочки, что означает, что вы можете использовать любой язык сценариев, который вам нравится:
:%!perl -nle 'print if $. % 2'
(или используйте «если» вместо «если», в зависимости от того, какие строки вы хотите)
-l
переход на Perl ... также, я бы сказал, что awk
он немного более распространен, чем Perl, хотя на самом деле в наши дни он не намного больше и может сделать это короче: :%!awk NR\%2
или :%!awk 1-NR\%2
для других строк.
:%!awk -- '++c\%2'
альтернативно
:%!awk -- 'c++\%2'
в зависимости от того, какую половину вы хотите отсеять.
NR
переменную?
:%!awk NR\%2
или :%!awk 1-NR\%2
, как я написал в другом комментарии. Это вряд ли дольше.
1-NR
длиннее чем c++
. Да, я знаю, что это один персонаж. Как я уже сказал, настоящая причина в том, что я забыл об этом. Во всяком случае, похоже, что люди не ценят здесь красоты awk.
NR
короче ++c
:)
Вы можете использовать собственные возможности Vim для поиска и замены, например: Поместите курсор в первую строку и введите в обычном режиме:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/
диапазон для замены. Это означает «от этой строки до строки, соответствующей регулярному выражению fff
(в данном случае последней строки).s///
это замещающая команда. Он ищет регулярное выражение и заменяет каждое его вхождение строкой. Знак g
в конце означает повторение подстановки до тех пор, пока регулярное выражение будет найдено.\n.*\(\n.*\)
соответствует новой строке, затем целой строке ( .*
соответствует любому количеству символов, кроме новой строки), затем еще одной новой строке и другой строке. Скобки \(
и \)
вызывают запись выражения внутри них, чтобы мы могли использовать его позже, используя \1
.\1
вставляет сгруппированную новую строку и строку после нее обратно, потому что мы не хотим, чтобы следующая строка тоже уходила - мы просто хотим, чтобы механизм подстановки прошел мимо нее, чтобы мы не удаляли ее при следующей замене.Таким образом, вы можете контролировать диапазон, в котором вы хотите, чтобы произошло удаление, и вам не нужно использовать какие-либо внешние инструменты.
$
вместо /fff/
, для конца файла, независимо от содержимого файла.
В качестве другого подхода вы также можете использовать python, если ваш vim поддерживает его.
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]
временно копирует все строки в текущем буфере в b
. b[::2]
получает каждую вторую строку из буфера и назначает ее всему текущему буферу cb[:]
. Копирование в b
необходимо, поскольку буферные объекты, похоже, не поддерживают расширенный синтаксис среза.
Вероятно, это не «путь vim», но его будет легче запомнить, если вы знаете Python.
Чтобы удалить нечетные строки (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
Чтобы удалить четные строки (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
Найдите текст (формирует первую строку), за которым следует символ новой строки и еще немного текста (формирует вторую строку), за которым следует другой символ новой строки, и замените указанное выше либо первым совпадением (нечетная строка), либо вторым совпадением (четная строка) с последующим возвратом каретки.
вы можете попробовать это в vim
:1,$-1g/^/+1d
Постараюсь пояснить (две части)
первая часть диапазон выбора ( :from,to
)
вторая часть действие ( d
удалить)
:1,$-1
)g
) delete ( +1d
) следующая строкавы можете попробовать перейти к первой строке вашего файла и выполнить, :+1d
вы увидите, что следующая строка исчезнет
Я знаю, что это грязно, но это энергично и работает