Vim: сортировка с использованием нескольких шаблонов

Я знаю, что в vim я могу сортировать файл с помощью регулярного выражения, чтобы указать, какие части каждой строки Я хочу использовать для рассмотрения при сортировке с помощью:

:sort 'regex' r

можно ли объединить более одного выражения?

вот вам пример:

вход:

bar a 2
foo b 1
bar b 1
foo a 2

:сортировка '[a-z] ' r

foo b 1
bar b 1
bar a 2
foo a 2

сортировать '[0-9] ' r

bar a 2
bar b 1
foo b 1
foo a 2

ожидается (возможно, что-то "вроде": sort '[A-Z]|[0-9] ' r ?):

bar b 1
bar a 2
foo b 1
foo a 2

обратите внимание, что голая " сортировка "не работает из-за тех" a "и" b", которые нарушают порядок цифр

bar a 2
bar b 1
foo a 2
foo b 1

альтернатива вне VIM также принимается, но, ради любопытства, я хотел бы знать, действительно ли это возможно сделать в VIM (и если afermative, как ;-)

большое спасибо, С уважением

2 ответов


предполагая, что у вас есть доступная внешняя сортировка, должно работать следующее:

:%!sort -k1,1 -k3,3n

EDIT: объяснение:

-k используется для задания ключей сортировки. -k1,1 подразумевает начало сортировки на key1 и key1. -k3,3n подразумевает начало сортировки на key3 и key3; n здесь обозначает числовую сортировку, т. е. сравнение по числовому значению строки.

по умолчанию сортировка предполагает переход от пустого к непустому в качестве поля разделитель. Таким образом, он будет рассматривать линию bar b 1 состоит из трех полей. Если значения были разделены определенным символом, отличным от пробела, скажите :, вы бы указали разделитель полей, добавив -t:.


есть недостаток в том, что вы просите... Если вы хотите отсортировать по первому слову и номеру, то нужно как-то указать порядок очередности. Другими словами, вы хотите, чтобы отсортированный список выглядел следующим образом:

bar b 1
bar a 2
foo b 1
foo a 2

или это:

bar b 1
foo b 1
bar a 2
foo a 2

очевидно, что ответ-первый. Но ты должен сказать это ВИМ! Следовательно, я не могу придумать никакого (разумного) способа сделать это в одной команде... Но, я могу сделать это за два:

:sort /\d/ r
:sort /[a-z]/ r

делая команды в следующем порядке, указывается, что первое слово имеет приоритет над количеством.