Объединить строки между определенным текстовым шаблоном в 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
Спасибо. Я понятия не имею, как эта штука работает, но, похоже, так и есть! Я должен буду тщательно проанализировать это. Я также нашел обходной путь, соединив все строки, а затем вставив новую строку на «А».
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» для соединения и «!» для присоединения без добавления пробела. Спасибо.
14:00

@ Миро вау! Я приветствую вас, сэр. если бы вы могли объяснить, почему это работает, то супер! .. также мне пришлось конкатенировать строки с символом табуляции между ними ... так что я сделал, чтобы добавить / $ / \ t / g символ табуляции в конце каждой строки перед выдачей выше команды .. лучше, чем
раньше
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.