2013-07-02 18 views
8

Wiem, że w vim, można sortować plik za pomocą wyrażenia regularnego, aby wskazać, które części każdego wiersza chcę użyć do rozważenia podczas sortowania za pomocą:Vim: sort stosując wielokrotne wzory

:sort 'regex' r 

Czy można połączyć więcej niż jedno wyrażenie?

Tu masz przykład:

INPUT:

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

sort '[az]' r

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

sort '[0-9]' r

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

OCZEKIWANY (może coś "jak": sortuj "[AZ] | [0-9]”R):

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

Należy pamiętać, że goły "sort" nie działa, z powodu tych "a" i "b", która złamać cyfry zamówić

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

alternatywą poza VIM jest również zaakceptowane, ale, na litość ciekawości, chciałbym wiedzieć, czy jest to rzeczywiście możliwe, aby to zrobić w ciągu VIM (a jeśli afermative jak ;-)

Wielkie dzięki, Pozdrowienia

+0

Wynik sortowania [0-9] 'r' nie jest wklejony poprawnie. Wynik powinien być inny. – Birei

+0

@Birei: Masz rację. Po prostu to poprawiłem. Dzięki! –

Odpowiedz

6

Zakładając, że masz coś w rodzaju zewnętrznego dostępne dodaje powinno działać:

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

EDIT: Objaśnienie:

-k służy do określania kluczy sortowania. -k1,1 sugeruje sortowanie rozpoczynające się na key1 i kończy to key1. -k3,3n implikuje sortowanie rozpoczynające się na key3 i kończy się key3; n oznacza tutaj sortowanie numeryczne, tj. Porównywanie zgodnie z wartością liczbową ciągu znaków.

Domyślnie sortowanie zakłada puste lub niepustne przejście jako separator pól. W związku z tym linia bar b 1 może składać się z trzech pól. Jeśli wartości zostały ograniczone przez konkretny znak inny niż spacja, na przykład :, należy określić separator pól, dodając -t:.

+0

Dobrze, to działa! Czy mógłby Pan jednak wyjaśnić znaczenie tych paramerów, więc mogę z łatwością rozszerzyć go na inne (rzeczywiste, to był uproszczony przykład) sytuacje? –

+0

@CarlesSala patrz wyjaśnienie powyżej. – devnull

+0

Idealne, to wystarczy! Dzięki! –

2

Istnieje pewna wada tego, o co prosisz ... Jeśli chcesz sortować według pierwszego słowa ORAZ numeru, musisz w jakiś sposób określić kolejność pierwszeństwa. Innymi słowy, chcesz lista posortowana wyglądać tak:

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

lub ta:

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

Oczywiście, odpowiedź jest pierwsza. Ale musisz powiedzieć vimowi! Dlatego nie mogę wymyślić żadnego (rozsądnego) sposobu na zrobienie tego w jednym poleceniu ... Ale mogę to zrobić w dwóch:

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

wykonując polecenia w tej kolejności, jesteś określając, że pierwsze słowo ma pierwszeństwo przed numerem.

+0

Nie widzę usterki ... Potrzeba zamówienia na takie żądanie jest oczywista, i chociaż nie sprecyzowałem konkretnie zamówienia, zrobiłem to pośrednio (powiedziałem, że chcę użyć dwóch reguł, sugerowanych "[az ] | [0-9] ', wkleił wynik ...). W każdym razie, czy mógłbyś wyjaśnić, dlaczego twoja sugestia działa? Co to takiego/\ d/i/a-z]/faktycznie robi? –

+0

\ d jest równoważne [0-9]. /.../ jest odpowiednikiem wpisania "..." w tym kontekście. Moja składnia jest prawdopodobnie bardziej "znormalizowanym" sposobem, ale nie ma w tym nic złego. Oznacza to to samo. Możesz także po prostu wpisać: sor, zamiast: sort, jeśli chcesz zapisać to dodatkowe naciśnięcie klawisza - ale nie zawracałem sobie głowy myleniem z tym! Wada polega na tym, że polecenie: sort wyszukuje ** wzór ** w każdym wierszu, a następnie zmienia kolejność wierszy na podstawie tego wzorca. Poszukujesz dwóch różnych wzorców, które wykraczają poza zakres polecenia (myślę, o ile wiem). –

+0

Ale też chodzi o to, jak zamierzasz powiedzieć vimowi, aby posortował kolumnę 1 w kolumnie 3 i zignorować kolumnę 2? Jestem prawie pewien, że to nie jest możliwe ... i po co zawracać sobie głowę, skoro możesz tak zrobić w 2 prostych poleceniach? –