2013-07-02 7 views
8

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

:sort 'regex' r 

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

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

ВХОД:

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

: сорт '[аз] г

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

рода '[0-9]' г

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

ОЖИДАЕМЫЙ (возможно, что-то вроде «: sort» [AZ] | [0-9] г):

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

Пожалуйста, обратите внимание, что голое „вроде“ не работает, в связи с тем, „а“ и „б“, которые перерыву цифры заказа

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

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

Большое спасибо, Привет

+0

Результат 'sort '[0-9]' r' не вставлен правильно. Результат должен быть другим. – Birei

+0

@Birei: Вы правы. Просто поправил его. Благодаря! –

ответ

6

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

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

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

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

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

+0

Правильно, это работает! Однако не могли бы вы объяснить смысл параметров, поэтому я могу легко расширить его до разных (реальных, это был упрощенный пример) ситуаций? –

+0

@CarlesSala смотрите описание выше. – devnull

+0

Отлично, вот и все! Благодаря! –

2

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

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

или это:

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

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

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

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

+0

Я не вижу недостатка ... Необходимость заказа для такого запроса очевидна, и хотя я не указал порядок явно, я сделал это неявно (я сказал, что хочу использовать два правила, предлагаемые «[az ] | [0-9] ', вставил результат ...). В любом случае, не могли бы вы объяснить, почему ваше предложение работает? Каковы эти/\ d/и/[a-z]/на самом деле? –

+0

\ d эквивалентно [0-9]. /.../ эквивалентно набору «...» в этом контексте. Мой синтаксис, вероятно, более «стандартизированный» способ сделать это, но нет ничего плохого в вашем. Это означает то же самое. Вы также можете просто набрать: sor, а не: sort, если вы хотите сохранить это дополнительное нажатие клавиши - но я не стал путать вас с этим! Недостатком является то, что команда: sort ищет ** ** шаблон в каждой строке, а затем переупорядочивает строки на основе этого шаблона. Вы ищете два разных шаблона, которые не входят в объем команды (я думаю, насколько я могу судить.) –

+0

Но также, как вы собираетесь сказать vim, чтобы сортировать столбец 1 над столбцом 3 , и игнорировать столбец 2? Я уверен, что это даже не возможно ... и зачем беспокоиться, когда вы можете просто сделать это в 2 простых командах? –

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