Можно ли преобразовать текст в форме журнала изменений в самое новое, используя vim?

Это вот так:

version 1.0

multi_line description for 1.0


version 1.01

multi_line description for 1.01

etc

и я хочу преобразовать его в

version 1.90

multi_line description for 1.90


version 1.89

multi_line description for 1.89

etc

Текст действительно слишком длинный, чтобы преобразовать его вручную.

PS. "многострочное описание", например:

Added feature x
Fixed bug y
Removed element z
Updated file z

1 ответ1

1

Я предполагаю, что вы просто хотите изменить порядок, а не пересортировать.

Это работает в моем маленьком тесте:

:g/^version/,/\nversion\|\%$/m0

Это предполагает, что любая строка, начинающаяся с "version", является началом раздела, который вы хотите сохранить вместе. Более простой способ сделать это - добавить пустую строку, содержащую только "версию" в конце файла, затем

:g/^version/,//-m0

игнорируйте сообщение об ошибке и удалите пустую строку.

В любом случае, это говорит vim выполнять [range]m0 на каждой строке, соответствующей ^version . Команда m0 или :move 0 перемещает указанные строки в начало файла.

Во второй версии диапазон переходит от текущей строки (соответствующей ^version) к следующей соответствующей строке, минус 1. Если вы можете сэкономить лишние два символа, добавьте точку и 1: .,//-1 эквивалентно ,//- .

Первая версия, которую я дал, создает более сложную схему, чтобы учесть тот факт, что в последнем совпадении поиск следующего совпадения не удастся. В шаблоне vim \%$ относится к последней строке или EOF.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .