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.