Come dividere una linea in più linee in modo efficiente?


11

Ho ricevuto dati registrati in un file di testo che è solo una lunga riga con ogni valore separato da uno spazio. Esiste un comando o un insieme di comandi che divide una riga in più righe?

Risposte:


21

Puoi semplicemente sostituire qualsiasi spazio consecutivo sulla linea con una nuova riga usando il comando :s/\s\+/\r/g. \s\+significa uno o più caratteri di spazi bianchi, ed \rè una nuova riga, vedere :help :substitutee :help regexpper i dettagli. Se si esegue il comando su una riga come:

foo bar baz

Ottieni:

foo
bar
baz

Se hai hlsearchabilitato e non vuoi ingombrare lo schermo con spazi evidenziati ovunque, puoi scrivere una piccola funzione come la seguente per evitarlo:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction

"Se non vuoi ingombrare lo schermo con spazi evidenziati ovunque", ciò presuppone troppo sull'impostazione dell'OP.
romainl,

@romainl Meglio?
toro2k,

1
Sì, è meglio IMO.
Romainl,

2
Lo è \r, vedi :help s/\r. Potrebbe essere sostituito da una letterale newline digitando <c-v><cr>. In questo contesto \nè un carattere null, vedi :help s/\n.
toro2k,

1
replaces the content of the register- quale registro?
Stillanoob,

5

L'uso vimdella sostituzione è probabilmente uno dei modi migliori per realizzare il tuo compito, ma puoi anche usare una macro. Supponiamo di avere i seguenti dati, con il cursore da qualche parte sulla linea 1:

1 a b c d e f
~

A partire dalla modalità normale, il colpo qqinizierà a registrare una macro richiamabile tramite @q. Qualunque cosa digitata dopo qqsarà ripetibile tramite la suddetta chiamata. Il nostro obiettivo è registrare i normali comandi che saranno abbastanza generali da consentire una ripetizione senza interruzioni.

Pertanto, possiamo digitare 0per portare il cursore all'inizio della linea, quindi fspaceper spostare il cursore sul primo spazio. Questo ci consente quindi di digitare renter, risultando in:

1 a
2 b c d e f
~

Colpire qora è una buona idea in quanto la nostra macro riutilizzabile è pronta per la ripetizione. Un po 'arbitrariamente, notiamo che ci sono 4 spazi da sostituire con le nuove righe. Quindi, premendo, 4@qripetiamo la qmacro 4 volte risultando in:

1 a
2 b
3 c
4 d
5 e
6 f
~

Si noti che a causa del modo in cui abbiamo istituito la macro, sarebbe stato sicuro per ripetere il comando oltre 9000 volte, in quanto inciderebbe solo la riga corrente, e dal momento che non c'erano gli spazi per la destra dell'ultimo immissione dei dati, fspacelo farà "ben" fallisce, impedendo che i dati vengano sostituiti con nuove righe.

Quindi, per ripetere dall'inizio:

qq0fspacerenterq9001@q

fornisce il nostro risultato.


1
Adoro che tu abbia un 9001tasto sulla tastiera per digitare velocemente il tuo nome utente.
Ricco

4

Il modo più semplice che ho trovato per dividere le linee in Vim è il comando in modalità normale gq(digitare entrambe le lettere in rapida successione in modalità normale o visiva).

In modalità visiva, dividerà tutto ciò che è selezionato, in modalità normale, segui gqcon un movimento.

Ad esempio, gqldividerà una riga per la larghezza attualmente impostata. Per impostare la larghezza delle linee di divisione in modo che sia diversa dall'impostazione corrente, è possibile utilizzare :set textwidth=n, dove si ntrova il numero di caratteri che si desidera in una linea, ad esempio, 10e tornare alla larghezza normale al termine.

Ho ottenuto queste informazioni da un video Youtube di Kholidfu che mostra come unire e dividere le linee in modalità normale usando un movimento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.