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.