2013-07-02 11 views
8

So che, in vim, posso ordinare un file utilizzando un'espressione regolare per indicare quali parti di ogni riga che voglio usare per prendere in considerazione, mentre l'ordinamento utilizzando:Vim: sort utilizzando più modelli

:sort 'regex' r 

Is è possibile combinare più di una espressione?

Ecco un esempio:

INPUT:

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

: tipo '[az]' r

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

sorta '[0-9]' r

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

PREVISTO (forse qualcosa di "simile": sort '[AZ] | [0-9]' r):

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

Si prega di notare che una "sorta" nuda non funziona, a causa di quelli "a" e "b" che rompono le cifre ordinare

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

Un VIM fuori alternativa è anche accettato, ma, per amor di curiosità, vorrei sapere se è davvero possibile farlo all'interno di VIM (e se afermative, how ;-)

Molte grazie, saluti

+0

Il risultato di 'sort '[0-9]' r' non è incollato correttamente. Il risultato dovrebbe essere diverso. – Birei

+0

@Birei: hai ragione. L'ho appena corretto. Grazie! –

risposta

6

Supponendo di avere sorta esterno disponibile, il seguente dovrebbe funzionare:

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

EDIT: Spiegazione:

-k viene utilizzato per specificare chiavi di ordinamento. -k1,1 implica inizio ordinamento su key1 e terminarlo key1. -k3,3n implica inizio ordinamento su key3 e terminarlo key3; n indica un ordinamento numerico, cioè confronta in base al valore numerico della stringa.

Per impostazione predefinita, l'ordinamento presuppone la transizione da vuoto a non vuoto come separatore di campo. Come tale, considererebbe la riga bar b 1 composta da tre campi. Se i valori sono delimitati da un carattere specifico diverso dallo spazio, ad esempio :, specificare il separatore di campi aggiungendo -t:.

+0

Bene, funziona! Tuttavia, ti dispiacerebbe spiegare il significato dei params, quindi posso facilmente estenderlo a situazioni diverse (vero, questo è un esempio semplificato)? –

+0

@CarlesSala vedi spiegazione sopra. – devnull

+0

Perfetto, questo ha fatto il trucco! Grazie! –

2

C'è un difetto in quello che stai chiedendo ... Se vuoi ordinare la prima parola E il numero, allora devi in ​​qualche modo specificare l'ordine di precedenza. In altre parole, vuoi l'elenco ordinato a guardare come questo:

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

o, in questo modo:

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

Ovviamente, la risposta è il primo. Ma devi dirlo! Quindi, non riesco a pensare a nessun (ragionevole) modo di farlo in un solo comando ... Ma, posso farlo in due:

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

Facendo i comandi in questo ordine, si specifica che la prima parola è prioritaria rispetto al numero.

+0

Non vedo il difetto ... La necessità di un ordine per tale richiesta è ovvia, e anche se non ho specificato esplicitamente l'ordine l'ho fatto implicitamente (ho detto che voglio usare due regole, suggerito '[az ] | [0-9] ', incollato il risultato ...). Ad ogni modo, ti dispiacerebbe spiegare perché il tuo suggerimento funziona? Cosa stanno facendo/\ d/e/[a-z]/effettivamente? –

+0

\ d è equivalente a [0-9]. /.../ equivale a digitare '...', in questo contesto. La mia sintassi è probabilmente il modo più "standardizzato" per farlo, ma non c'è niente di sbagliato nel tuo. Significa la stessa cosa. Puoi anche digitare semplicemente: sor, invece di: sort, se vuoi salvare quel tasto in più - ma non mi sono preoccupato di confonderti con quello! Il difetto è che il comando: sort cerca ** un ** motivo in ogni riga, quindi riordina le righe in base a quel modello. Stai cercando due modelli diversi, che sono al di fuori dell'ambito del comando (credo. Per quanto ne so). –

+0

Ma anche, il punto è, come hai intenzione di dire a vim di ordinare la colonna 1 sulla colonna 3 e ignora la colonna 2? Sono abbastanza sicuro che non è nemmeno possibile ... e perché preoccuparsi, quando puoi farlo in 2 semplici comandi comunque? –