Vim - додавання порожнього рядка між рядками


15

Як вставити порожній рядок між усіма порожніми рядками?

напр. з

line 1
line 2
line 3

line 4
line 5

до

line 1

line 2

line 3

line 4

line 5

Відповіді:


27

Команда Vim: g призначена саме для такого роду завдань; виконання однієї дії у кожному рядку, який відповідає певному шаблону. Ось моя відповідь:

:g/.\n\n\@!/norm o

Я використовую схему /.\n\n\@!/. Розбивши це на складові частини:

  • .Відповідає будь-якому символу в рядку. (використовується для негайного вилучення будь-яких існуючих порожніх рядків з розгляду)
  • \n Відповідає одному \ n в кінці символу вище
  • \n\@! Не вдалося збігнути, якщо є інше \ n одразу після попереднього \ n.

(Перевірте, чи :h E59більше інформації про \@!та подібні специфікатори відповідності в регулярних виразах - є ще пара!)

Отже, регулярний вираз команд: g тепер вибрав кожен непустий рядок, який закінчується одним новим рядком, і за яким не слідує порожній рядок.

Після шаблону в :gоператорі з'являється команда для запуску на відповідні рядки. У цьому випадку я сказав йому виконати команду в звичайному режимі (скорочено norm), а команда для запуску - це просто o, яка вставляє порожній рядок нижче поточного рядка.

Таким чином, команда знаходить кожен рядок, який не має порожнього рядка під ним, і додає його. І це все є! Можливо, ви хочете перевірити статтю Power of G від vim wiki для більш вигадливих речей, які ви можете зробити :g(і це негативна сестра, :v) - це одна з тих дивовижно корисних команд, на які незабаром ви зробите покладатися, а потім страшно пропускаєте редакторів. які не мають.


1
Точно. Я, як правило, шукаю скорочення, :%norm oале, виявляється, це не працює, як було передбачено у випадку o. +1
— вересень

Введіть :%s/$/, потім натисніть ^V, потім натисніть Enter.
— jpaugh

1
@jpaugh Припускаючи, що ви маєте на увазі :%s/$/<C-V><CR><CR>(використовувати загальне vim-folk кодування клавіш), такий підхід просто додає новий рядок після кожного рядка. Тобто рядки, які вже розділені пробілами (див. Рядок 3 -> рядок 4, у тексті прикладу), завершуються, отримуючи зайві порожні рядки. Оригінальним питанням було уникати додавання зайвих порожніх рядків там, де вони вже існували у вихідному тексті.
— Тревор Пауелл

3

Коли я перевірив глобальну відповідь на пошук та заміну @ NeilForester, я виявив, що він пропускав кожну другу передбачувану заміну в послідовних непорожніх рядках, якщо рядки мали лише один символ у кожному. Це, мабуть, пояснюється тим, що візерунок починає співпадати в кожному випадку після останнього символу, який відповідає попередньому випадку.

Використання перспективи та пошуку даних вирішує цю проблему і також робить регекс трохи коротшим:

:%s/\n\@<!\n\n\@!/\r\r/g

Спасибі! Це працює, і він не додає більше рядків, якщо я запускаю пошук знову (якщо скажімо, я додав нові рядки у свій файл).

1
Чи можете ви пояснити, що означає кожен з регулярних виразів у шаблоні пошуку? Переглядаючи довідку vim, \n\@<!\nозначає, що будь-який рядок рядків, який не є одразу після іншого, є правильним? Але я не могла зрозуміти, що \n\@!означає. Я хотів би зрозуміти це, щоб я міг навчитися та застосувати його до інших моделей пошуку :)

Так, \n\@<!\nозначає будь-яку лінію, яка не одразу слідує за іншою лінією. \n\@!збігається з нульовою шириною, якщо попередній атом (тобто \n) не збігається безпосередньо перед наступним. Спробуйте :help \@<!переглянути документацію про це in vim. Я
— Саймон

3

Інший спосіб:

%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.


0

Виправте мене, якщо я помиляюся. Я вважаю, ви використовуєте букву k, коли в командному режимі рухаєтеся вниз по рядку. Потім введіть режим вставки та додайте наступний рядок. Повторіть по мірі необхідності? Сподіваюся, це допомагає!


kрухається вгору по лінії. jрухається вниз по лінії.
— Ніл Форестер

Так, це дійсно так. Моя помилка. Дякую Нілу!

0
/[^\n]\n[^\n]
:map <F2> no<esc><F2>

Потім натисніть <F2>. Це дозволить шукати два послідовні непорожні рядки, а потім додавати рядок між ними кілька разів.

Редагувати:

Ось альтернативний спосіб зробити це за допомогою єдиного глобального пошуку та заміни:

:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g

У моєму файлі багато рядків. Чи існує спосіб пошуку регулярного виразу та вставки порожнього рядка для всього файлу? Я дивився на stackoverflow.com/questions/2673209/…, але не зміг зрозуміти, що означають усі команди регулярних виразів.

Дивіться мою вище редакцію щодо альтернативного способу виконання того ж самого за допомогою однієї команди та без рекурсивного відображення. Перший спосіб повинен працювати для всього файлу.
— Ніл Форестер

0

Спробуйте цю команду ( 16символи):

:%!sed G|cat -s

Замість того, щоб намагатися "вимгольфувати" коротку команду, трохи корисніше пояснення використаних досить незрозумілих варіантів.
— Інго Каркат

0

Я не знаю, як довго триває ваш файл, але одним із найпростіших методів є введення oв командному режимі. І в наступному рядку .. Це може бути завантажений простим макросом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.