Об’єднайте рядки між певним візерунком тексту у Vim


8

У мене є текстовий файл, який виглядає приблизно так:

A.
text
text
text


A.
more text

more text

A.
more text

Я хочу приєднати всі рядки між "маркерами", A.щоб це виглядало так:

A.texttexttext
A.more textmore text
A.more text

Як я можу це зробити у Vim?

Відповіді:


4
:%s/\n\(\(A\.$\)\@!.*\)/\1/

Замініть відповідність шаблону:

  1. новий рядок,
  2. група, що містить

    1. не рядок, A.за яким безпосередньо йде кінець рядка
    2. будь-який символ до кінця рядка

з:

  • все збігається, крім початкового нового рядка (тобто групи вище),

і робити це в усьому світі.


1
Дякую. Я поняття не маю, як ця річ працює, але, здається, це! Мені доведеться ретельно її розсікати. Я також знайшов обхід, з'єднавши всі рядки, а потім вставивши новий рядок на "A."
vim noob

@vimnoob: див. :help \@!у Vim для отримання додаткової інформації про цю частину. Інакше це прямо, сподіваюся, з моїм поясненням. Проблема вашого підходу полягає в тому, що якщо " A." трапляється в тексті, хоч і не як ізольована лінія маркера, вона буде розбита на ніби спочатку маркер. На практиці це може не бути проблемою (я не знаю, як виглядає ваш "справжній" файл), але загалом це може спричинити небажану поведінку, якщо хтось цього не знає.
Даніель Андерссон

@vimnoob: Я знову прочитав свою відповідь, і якщо ви не знайомі з :%s///синтаксисом: це синтаксис "пошук і заміна" у Vim. :запускає команду, %визначає весь буфер як діапазон, sпочинає заміну. /- це роздільник шаблону (будь-який інший символ може бути використаний, але /"стандартний"). Перший /запускає шаблон пошуку, другий - шаблон заміни, а третій закінчує його. Доступні модифікатори для задання нечутливості до випадків тощо. \1Являє собою захоплену групу в шаблоні пошуку. :%s/foo/bar/замінює fooз barв файлі.
Даніель Андерссон

Велике спасибі за вашу допомогу. Мені просто потрібно це дослідити \ @! як я знайомий з основною пошуковою заміною та базовим регулярним виразом.
vim noob

1
@ Reman: Найбільш прямолінійний спосіб, про який я відразу думаю, - це подальша відповідність глобальної моделі, як-от :%s/^A\.//. Метод у відповіді не фіксує ^A\.самі шаблони (скоріше їх відсутність), тому він не може змінити ці рядки очевидним чином.
Даніель Андерссон

7

Це також працює (коли починається перший рядок A.)

:v/^A/-1j!

Це працює! Приємно. +1
ZaSter

Так, по-справжньому, і два трюки, нові для мене, після глобального протизразкового поєднання (v): "j" для приєднання, і "!" для приєднання без додавання пробілу. Дякую.
фортбоаз

@Miro wow! я вітаю вас, сер. якщо ви могли пояснити, чому це працює, то супер! .. Також мені довелося з'єднати рядки з символом вкладки між ними ... так що я зробив, щоб додати як / $ / \ t / g символьний кінець кожного рядка перед видачею вище команда .. будь-який кращий спосіб
ihightower
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.