Как вставить пустую строку между каждыми непустыми строками?
например. от
line 1
line 2
line 3
line 4
line 5
в
line 1
line 2
line 3
line 4
line 5
Как вставить пустую строку между каждыми непустыми строками?
например. от
line 1
line 2
line 3
line 4
line 5
в
line 1
line 2
line 3
line 4
line 5
Команда Vim's:g предназначена именно для такого рода задач; запускать одно действие в каждой строке, которое соответствует определенному шаблону. Вот мой ответ:
:g/.\n\n\@!/norm o
Шаблон, который я использую, - это /.\n\n\@!/ . Разбивая это на составляющие части:
. Соответствует любому символу в строке. (используется для немедленного удаления любых существующих пустых строк из рассмотрения)\n Соответствует одному \n в конце символа выше\n\@! Сбой совпадения, если есть другой \n сразу после более раннего \n.(Проверьте :h E59 для получения дополнительной информации о \@! и аналогичные спецификаторы соответствия в регулярных выражениях - есть еще пара других!)
Таким образом, регулярное выражение команды:g теперь выбрало каждую непустую строку, которая заканчивается одной новой строкой и за которой не следует пустой строки.
После шаблона в операторе a :g следует команда для запуска на совпадающих строках. В этом случае я сказал ему выполнить команду в обычном режиме (сокращенно до norm), а команда для запуска - просто o , которая вставляет пустую строку ниже текущей строки.
Собранные вместе, команда находит каждую строку, в которой нет пустой строки, и добавляет ее. И это все, что нужно сделать! Возможно, вы захотите проверить статью о мощности G в vim wiki, чтобы узнать, что вы можете сделать с ней :g (и это отрицательная сестра :v) - это одна из тех удивительно полезных команд, на которые вы скоро захотите положиться, а затем ужасно скучаю по редакторам, у которых его нет.
Когда я тестировал глобальный ответ @ NeilForester на поиск и замену, я обнаружил, что он пропускает каждую намеченную замену в последовательных непустых строках, если в строках содержится только один символ в каждой. Похоже, это связано с тем, что шаблон начинает совпадать в каждом случае после последнего символа, которому он соответствует в предыдущем случае.
Использование lookbehind и lookahead решает эту проблему и также делает регулярное выражение немного короче:
:%s/\n\@<!\n\n\@!/\r\r/g
По-другому:
%s/\(.\)\n\(.\)/\1\r\r\2/
Что значит,
\(.\) match and capture a non-newline character,
\n match a newline
\(.\) match and capture a non-newline character
заменить на: первый захват, двойной перевод строки и второй захват.
Например, line1\nLine2 приводит к \1 = 1 и \2 = L
Поправь меня, если я ошибаюсь. Я полагаю, что вы используете букву k в командном режиме для перемещения вниз по строке. Затем войдите в режим вставки и добавьте следующую строку. Повторите по мере необходимости? Надеюсь это поможет!
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
Затем нажмите <F2> . Это будет искать две последовательные непустые строки, а затем добавить строку между ними, несколько раз.
Редактировать:
Вот альтернативный способ сделать это с помощью одного глобального поиска и замены:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
Попробуйте эту команду (16 символов):
:%!sed G|cat -s
Я не знаю, как долго ваш файл, но одним из самых простых методов является тип o в командном режиме.
И в следующей строке . ,
Это может быть загружено в простой макрос.