2016-06-19 3 views
1

Как поменять местами несколько столбцов, разделенных символом «:» в редакторе VIM? (требуется заказ 2, 3, 4, 1, (...))VIM: обменять столбцы, разделенные двоеточием

например. 1: 2: 3: 4: 5: 6 -> 2: 3: 4: 1: 5: 6

Редактировать: Мне нужно поменять местами более чем на одну строку одновременно.

ответ

1

Это будет работать:

:s/\v(.*):(.*):(.*):(.*):(.*):(.*)/\2:\3:\4:\1:\5:\6 
+0

Спасибо. А что, если всегда есть 5 столбцов и только иногда больше (5+)? Я полагаю, что-то вроде:: s/\ v (. *): (. *): (. *): (. *): (. *)/\ 2: \ 3: \ 4: \ 1: \ 5 (это не работает)? – Allemis

+0

круто! (+1) @Allemis, чтобы иметь дело с более чем 5, нам нужно не жадное повторение (см. Мой ответ). – JJoao

2

Если AWK доступны на вашей системе, я бы сделал это с внешней AWK, он выглядит более простым, чем регулярное выражение образом:

%!awk -F: -v OFS=":" '{print $2,$3,$4,$1,$5,$6}' 

Также это плагин, называемый «обмен», и это может облегчить его.

+0

Спасибо, но это не сработает - столбцы для обмена имеют разную длину (5 - ...), я думаю, что это сработало бы, только если бы было только шесть столбцов, если я не ошибаюсь ... – Allemis

+1

@Allemis линия awk легко расширяется. скажем, у вас 200 столбцов и вы просто хотите обменять 3 и 6, вы можете '%! awk -F: -v OFS =": "'{t = $ 3; $ 3 = $ 6; $ 6 = t} 7'' – Kent

+0

cool (+1), но почему «7»? – JJoao

0

Для того, чтобы иметь дело с более чем 5 полей, не жадный оператор повторения (.{-} вместо .*) следует использовать:

:s/\v(.{-}):(.{-}):(.{-}):(.{-}):/\2:\3:\4:\1:/ 
Смежные вопросы