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
делая команды в следующем порядке, указывается, что первое слово имеет приоритет над количеством.