2013-09-23 2 views
-1

У меня есть текстовый файл со многими строками.Как условно перемещать линии вверх?

test = 
more text more text more text more text 
more text more text more text more text 
... etc.... 
more text more text more text more text 
more text more text more text more text 
1 text 
test2 = 
more text more text more text more text 
more text more text more text more text 
3 more text 

и т.д.

То, что я хочу сделать, это переместить линии вверх, начиная с номером и прикрепить их после того, как обнаружил, что первая линия (движение назад) заканчивается «= \ х»

ожидаемый выход:

test = 1 text 
more text more text more text more text 
more text more text more text more text 
... etc.... 
more text more text more text more text 
more text more text more text more text 
test2 = 3 more text 
more text more text more text more text 
more text more text more text more text 

Я понятия не имею, как это сделать.
Может кто-нибудь мне помочь?

ответ

4

Использование :global, :norm, :move и возможность использовать поиск в качестве мишени для Ex команды:

:g/^\d/m?.*=$|norm kJ 

Разбивка:

:g/pattern/command " executes command for every line matching pattern 
^\d    " pattern for "lines that start with a number" 
m?.*=$    " move matched line to right below the first 
        " line ending with = upward 
|     " separator between Ex commands 
norm    " execute normal mode command 
kJ     " go to line above and join 
+0

та же идея с моим макросом. но: команда g будет лучше, чем макрос. +1 – Kent

+3

Vim golf: ': g/^ \ d/m?. * = $ | -j' –

+0

Большое спасибо romainl! – Reman

2

Макрос может помочь ...

/^\d<cr>:.m?=<cr>kJ 

краткое объяснение:

/^\d " find line beginning with number 
:.m?= " move current line under the previous line with (=) 
kJ  "move cursor back to the line with (=), and join the next 

он работает как:

(кажется, что я набрал еще один ? и последний n на снимке экрана, но я не буду записывать его снова.)

enter image description here

+0

Спасибо тоже Кент! Очень приятное решение, но, как вы уже упоминали, возможно, решение Romainl проще. – Reman

Смежные вопросы