Come posso unire due linee in vi?


169

Ho due righe in un file di testo come di seguito:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Voglio aggiungere le due righe in vi come di seguito:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

La seconda riga è stata eliminata e il contenuto della seconda riga è stato aggiunto alla prima riga.

Come potrei farlo usando la modalità di comando in vi?

Risposte:


310

Shift+ Jrimuove il carattere di cambio linea dalla linea corrente, quindi premendo "J" in qualsiasi punto della linea è possibile combinare la linea corrente e la linea successiva nel modo desiderato.


9
la maiuscola J unisce le linee, la minuscola sposta il cursore

4
Quella era una J maiuscola, non una J minuscola; quindi Shift-J.
Jonathan Leffler,

28
"rimuove il carattere di cambio linea dalla riga corrente" è un modo piuttosto imbarazzante per descrivere ciò che fa J, e non è neppure corretto. J "unisce" questa linea alla successiva. Nel processo rimuove la nuova riga, ma manipola anche gli spazi bianchi in altri modi.
Laurence Gonsalves il

5
Haha. GJin vimsi sposterà sull'ultima riga e quindi proverà a unirla alla riga successiva, l'unica posizione in cui un comando di join non ha senso. Sì, l'ho trovato divertente :-)
Alok Singhal il

2
Non riesco ancora a rendermi conto che dovevo andare su StackOverflow per unire due righe usando questo editor!
Manitra Andriamitondra,

59

Vi o Vim?

Ad ogni modo, il seguente comando funziona per Vim in modalità 'nocompatibile'. Cioè, suppongo, quasi puro vi.

:join!

Se vuoi farlo dal normale comando usa

gJ

Con 'gJ' si uniscono le linee così come sono - senza aggiungere o rimuovere spazi bianchi:

S<Switch_ID>_F<File type>
_ID<ID number>_T<date+time>_O<Original File name>.DAT

Risultato:

S<Switch_ID>_F<File type>_ID<ID number>_T<date+time>_O<Original File name>.DAT

Con il comando 'J' avrai:

S<Switch_ID>_F<File type> _ID<ID number>_T<date+time>_O<Original File name>.DAT

Nota spazio tra type>e _ID.


2
Voglio solo sottolineare che g/pattern/joinfunziona in VIM mentre g/pattern/Jnon lo fa. Potrebbe aiutare alcune persone future.
jisaacstone,

Mi piace il tuo join con il motivo, tuttavia, unisce due linee con uno spazio bianco. Ad ogni modo unire due linee con un motivo senza spazi bianchi?
David.Chu.ca,

g / modello / unirsi! sembra farlo.
Fortboise,

1
Può essere più complicato, per favore! :-)
Johannes Overmann,

22

Questo dovrebbe farlo:

J


6
'J' dà spazio extra quando si uniscono le linee.
Maxim Kim,

3
@MaximKim: E questo è il motivo . Nota che :h Jti dirà come disabilitare quella funzione.
Il

2
Utilizzare gJse non si desidera che vim aggiunga uno spazio quando si uniscono le linee
qwertzguy,

17

In vi, J(che è Shift+ J) o :joindovrebbe fare quello che vuoi, per la maggior parte. Si noti che regolano gli spazi bianchi. In particolare, finirai con uno spazio tra le due linee unite in molti casi e se la seconda riga è rientrata, il rientro verrà rimosso prima di unirsi.

In Vim puoi anche usare gJ( G, quindi Shift+ J) o :join!. Questi uniranno le linee senza effettuare alcuna regolazione degli spazi bianchi.

In Vim, vedere :help Jper ulteriori informazioni.


Un avvertimento quando si usa gJed Jè che entrambi spostano il cursore sul punto di unione, ma :join!e :joinnon lo fanno.
SergioAraujo,

4

Sostituisci semplicemente " \n" con "".

In vi / Vim per ogni riga del documento:

%s/>\n_/>_/g

Se vuoi confermare ogni sostituzione:

%s/>\n_/>_/gc


1

Premere Shift+ 4("$") sulla prima riga, quindi Shift+ j("J").

E se vuoi aiuto, vai in vi, quindi premi F1.


3
$ si sposta alla fine della riga, ma non è necessario per J

1
Non devi essere alla fine della linea per J per unire le linee.
Jonathan Leffler,

1
Premere $ non è necessario, in realtà.
Laurence Gonsalves il

1
@laurence .pressing $ assicura che il cursore sia posizionato proprio accanto alla nuova linea charter e questo è un must.
Vijay,


1

Un altro modo di unire due linee senza posizionare il cursore su quella linea è:

:6,6s#\n##

Qui 6 è il numero di linea a cui verrà unita un'altra linea. Per visualizzare il numero di riga, utilizzare :set nu.

Se ci troviamo sul cursore in cui si dovrebbe unire la riga successiva, allora:

:s#\n##

In entrambi i casi non abbiamo bisogno gpiace :s#\n##g, perché da una linea di una sola \nesistere.


È più facile da usare Shift+Vper selezionare tutte le linee che devono essere unite, tranne l'ultima, e quindi :'<,'>s/\n/, /in questo esempio unire le linee mettendo una virgola e uno spazio alla fine di ciascuna. Nota che quando viene selezionato qualcosa e digitiamo :in modalità normale, allora '<,'>appare automaticamente sulla riga di comando.
Evgeni Sergeev,

Buono per l'unione multipla selezionata con delimitatore preferito. Hai trovato un errore di battitura ... in modalità normale o visiva?
vusan,
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.