2013-07-02 2 views
8

Ich weiß, dass, in vim, ich eine Datei mit einem regulären Ausdruck zu prüfen, welche Teile jeder Zeile Ich möchte, um anzuzeigen, sortieren verwenden, während das Sortieren mit:Vim: Art mit mehreren Mustern

:sort 'regex' r 

Ist es möglich, mehr als einen Ausdruck zu kombinieren?

Hier haben Sie ein Beispiel:

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 

sortieren '[0-9]' r

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

ERWARTET (vielleicht etwas "wie": sort '[AZ] | [0-9]‘r):

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

Bitte beachten Sie, dass eine nackte "Art" nicht funktioniert, wegen denen "a" und "b", die die Ziffern brechen

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

Eine Alternative außerhalb VIM wird auch akzeptiert, aber aus Gründen der Neugier, würde ich gerne wissen, ob es tatsächlich möglich ist, es in VIM zu tun (und wenn afermative, wie ;-)

Vielen dank, Grüße

+0

Das Ergebnis von 'sort '[0-9]' r 'wird nicht korrekt eingefügt. Das Ergebnis sollte anders sein. – Birei

+0

@Birei: Du hast Recht. Habe es gerade korrigiert. Vielen Dank! –

Antwort

6

Unter der Annahme, dass Sie externe Art zur Verfügung haben, sollten folgende Arbeiten:

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

EDIT: Erläuterung:

-k verwendet Sortierschlüssel angeben. -k1,1 bedeutet, starten Sie die Sortierung auf key1 und beenden Sie es key1. -k3,3n bedeutet, starten Sie die Sortierung auf key3 und beenden Sie es key3; n bezeichnet hier eine numerische Sortierung, d. H. Vergleich gemäß einem numerischen Zahlenwert.

Standardmäßig geht sort von leer bis nicht leer als Feldtrennzeichen. Daher würde die Zeile bar b 1 aus drei Feldern bestehen. Wenn die Werte durch ein anderes Zeichen als das Leerzeichen begrenzt wären, z. B. :, würden Sie das Feldtrennzeichen angeben, indem Sie -t: hinzufügen.

+0

Richtig, das funktioniert! Würde es Ihnen aber etwas ausmachen, die Bedeutung der Parameter zu erklären, damit ich sie leicht auf andere (reale, das ist ein vereinfachtes Beispiel) Situationen erweitern kann? –

+0

@CarlesSala siehe oben. – devnull

+0

Perfekt, das hat den Trick gemacht! Vielen Dank! –

2

Es gibt einen Fehler in dem, was Sie fragen ... Wenn Sie nach dem ersten Wort UND die Nummer sortieren möchten, dann müssen Sie irgendwie die Reihenfolge der Priorität angeben. Mit anderen Worten, haben Sie die sortierte Liste wie folgt aussehen wollen:

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

oder dies:

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

Offensichtlich ist die Antwort der erste. Aber du musst es vim sagen! Daher kann ich mir keinen (vernünftigen) Weg vorstellen, dies in einem Befehl zu tun ... Aber, ich kann es in zwei tun:

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

Durch die Befehle in dieser Reihenfolge tun Sie fest, dass das erste Wort Vorrang vor der Zahl nimmt.

+0

Ich sehe den Fehler nicht ... Die Notwendigkeit einer Bestellung für eine solche Anfrage ist offensichtlich, und obwohl ich die Reihenfolge nicht explizit angegeben habe, habe ich es implizit (ich sagte, wollen zwei Regeln verwenden, vorgeschlagen '[az ] | [0-9] ', das Ergebnis eingefügt ...). Wie auch immer, würde es Ihnen etwas ausmachen zu erklären, warum Ihr Vorschlag funktioniert? Was machen diese/\ d/und/[a-z]/tatsächlich? –

+0

\ d entspricht [0-9]. /.../ entspricht in diesem Zusammenhang der Eingabe von '...'. Meine Syntax ist wahrscheinlich die "standardisierte" Art, dies zu tun, aber es ist nichts falsch mit Ihrem. Es bedeutet dasselbe. Sie können auch einfach Folgendes eingeben: sor, anstatt: sort, wenn Sie diesen zusätzlichen Tastendruck speichern möchten - aber ich habe Sie nicht damit verwechselt! Der Fehler ist, dass der Befehl: sort in jeder Zeile nach ** a ** -Muster sucht und dann die Zeilen basierend auf diesem Muster neu anordnet. Sie suchen nach zwei verschiedenen Mustern, die außerhalb des Bereichs des Befehls liegen (ich denke. Soweit ich das beurteilen kann.) –

+0

Aber auch, der Punkt ist, wie willst du vim sagen, Spalte 1 über Spalte 3 zu sortieren , und Spalte 2 ignorieren? Ich bin mir ziemlich sicher, dass das überhaupt nicht möglich ist ... und warum, wenn du es einfach in 2 einfachen Befehlen machen kannst? –

Verwandte Themen