Как это сделать в 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@qPS: Чтобы перейти в командный режим, просто нажмите 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вы увидите, что следующая строка исчезнет
Я знаю, что это грязно, но это энергично и работает