Переместить строки, соответствующие: g, в начало файла - PullRequest
8 голосов
/ 02 июля 2011

У меня большой текстовый файл с несколькими вызовами определенной функции method_name.

Я сопоставил их, используя :g/method_name.

Как бы я переместил их наверхфайла (с первым совпадением сверху)?

Я пытался :g/method_name/normal ddggP, но это переворачивает порядок.Есть ли лучший способ напрямую вырезать и вставить все соответствующие строки по порядку?

Пример входного файла:

method_name 1
foo
method_name 2
bar
method_name 3
baz

Пример выходного файла:

method_name 1
method_name 2
method_name 3
foo
bar
baz

Ответы [ 3 ]

5 голосов
/ 02 июля 2011

Как насчет того, чтобы попробовать это наоборот: переместить несопоставленные линии вниз:

:v/method_name/normal ddGp

Кажется, что вы достигаете того, чего хотите.

4 голосов
/ 02 июля 2011

Я думаю, что вы можете достичь желаемого результата, сначала создав назначенную переменную до 0:

:let i=0

И затем выполнить эту команду:

:g/method_name/exec "m ".i | let i+= 1

В основном он вызывает :m, передавая в качестве адреса значение i , а затем увеличивает это значение на единицу, чтобы его можно было использовать в следующем матче. Кажется, работает.

Конечно, вы можете удалить переменную, когда она вам больше не нужна:

:unlet i
1 голос
/ 06 февраля 2016

Если файл действительно большой, количество подходящих записей мало, и вы не хотите перемещаться по всему файлу с решением v/<pattern>/ m$, вы можете сделать это:

Выберите любую марку, которая вас не волнует, скажем 'k. Теперь следующая последовательность клавиш делает то, что вы хотите:

ggmk:g/method_name/ m 'k-1

  • ggmk отмечает первую строку с 'k.
  • m 'k-1 перемещает совпадающую строку на 1 строку перед отметкой 'k (и отметка перемещается вниз вместе со строкой, к которой она прикреплена).

При этом будут перемещены только несколько совпадающих строк, а не весь файл.

Примечание: это как-то работает, даже если первая строка содержит шаблон - и у меня нет объяснения этому.

Для скриптов:

normal ggmk
g/method_name/ m 'k-1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...