Como uno duas linhas no vi?

169

Eu tenho duas linhas em um arquivo de texto como abaixo:

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

Quero acrescentar as duas linhas no vi, como abaixo:

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

A segunda linha foi excluída e o conteúdo da segunda linha foi anexado à primeira linha.

Como eu poderia fazer isso usando o modo de comando no vi?

Vijay
fonte

Respostas:

310

Shift+ Jremove o caractere de mudança de linha da linha atual; portanto, pressionando "J" em qualquer lugar da linha, você pode combinar a linha atual e a próxima da maneira que desejar.

GJ.
fonte
9
J maiúsculo une linhas, minúsculas move o cursor
4
Esse era um J maiúsculo, não um J minúsculo; daí Shift-J.
Jonathan Leffler
28
"remove o caractere de mudança de linha da linha atual" é uma maneira bastante incômoda de descrever o que J faz, e também não está realmente correto. J "une" esta linha à próxima. No processo, remove a nova linha, mas também manipula o espaço em branco de outras maneiras.
Laurence Gonsalves
5
Haha GJin vimpassará para a última linha e tentará associá-lo à próxima linha, o único lugar em que um comando de junção não faz sentido. Sim, eu achei isso engraçado :-)
Alok Singhal
2
Ainda não consigo perceber que eu precisava ir no StackOverflow para juntar duas linhas usando este editor!
Manitra Andriamitondra
59

Vi ou Vim?

De qualquer forma, o comando a seguir funciona para o Vim no modo 'nocompatível'. Isso é, suponho, quase puro vi.

:join!

Se você quiser fazê-lo a partir do comando normal, use

gJ

Com 'gJ', você une as linhas como estão - sem adicionar ou remover espaços em branco:

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

Resultado:

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

Com o comando 'J' você terá:

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

Observe o espaço entre type>e _ID.

Maxim Kim
fonte
2
Só quero salientar que g/pattern/joinfunciona no VIM enquanto g/pattern/Jnão funciona. Pode ajudar algumas pessoas no futuro.
jisaacstone
Eu gosto da sua união com o padrão, no entanto, ele une duas linhas com espaço em branco. Enfim, para unir duas linhas com um padrão sem espaço em branco?
26415 David.Chu.ca
g / padrão / junte-se! parece fazer isso.
fortboise
1
Pode ser mais complicado, por favor! :-)
Johannes Overmann
22

Isso deve servir:

J

samg
fonte
6
'J' oferece espaço extra ao unir linhas.
Maxim Kim
3
@ MaximKim: E é por isso . Observe que :h Jele lhe dirá como desativar esse recurso.
20/01/2015
2
Use gJse você não quiser vim para adicionar um espaço ao juntar as linhas
qwertzguy
17

No vi, J(isso é Shift+ J) ou :joindeve fazer o que você deseja, na maior parte. Observe que eles ajustam o espaço em branco. Em particular, você acabará com um espaço entre as duas linhas unidas em muitos casos, e se a segunda linha for recuada, esse recuo será removido antes da união.

No Vim, você também pode usar gJ( G, então Shift+ J) ou :join!. Eles unirão linhas sem fazer nenhum ajuste de espaço em branco.

No Vim, consulte :help Jpara obter mais informações.

Laurence Gonsalves
fonte
Uma ressalva ao usar gJe Jé que ambos mudam o cursor para o ponto de união, mas :join!e :joinnão.
SergioAraujo
4

Apenas substitua o " \n" por "".

No vi / Vim para cada linha do documento:

%s/>\n_/>_/g

Se você deseja confirmar cada substituição:

%s/>\n_/>_/gc
Carsten C.
fonte
3

Se você deseja unir as linhas selecionadas (você está no modo visual), basta pressionar gJpara unir suas linhas sem espaços.

Isso é descrito em mais detalhes no site do vi / Vim Stack Exchange .

Brad Parks
fonte
1

Pressione Shift+ 4("$") na primeira linha e, em seguida, Shift+ j("J").

E se você quiser ajuda, entre no vi e pressione F1.

ghostdog74
fonte
3
$ move para o final da linha, mas não é necessário para J
1
Você não precisa estar no final da linha para J juntar as linhas.
Jonathan Leffler
1
Pressionar $ não é necessário, na verdade.
Laurence Gonsalves
1
@ laurence .pressing $ garante que o cursor seja colocado ao lado da nova linha de charter e isso é obrigatório.
Vijay
1

No Vim você também pode usar gJ.

ََ

joshy
fonte
1

Outra maneira de unir duas linhas sem colocar o cursor nessa linha é:

:6,6s#\n##

Aqui 6 é o número da linha à qual outra linha será unida. Para exibir o número da linha, use :set nu.

Se estivermos no cursor onde a próxima linha deve ser unida, então:

:s#\n##

Em ambos os casos não precisamos ggostar :s#\n##g, porque em uma linha única \nexistir.

vusan
fonte
É mais fácil usar Shift+Vpara selecionar todas as linhas que serão unidas, exceto a última, e, :'<,'>s/\n/, /neste exemplo, unir linhas enquanto coloca uma vírgula e um espaço no final de cada uma. Observe que, quando algo é selecionado e digitamos :no modo normal, ele '<,'>aparece automaticamente na linha de comando.
Evgeni Sergeev
Bom para junção de várias linhas selecionada com delimitador preferido. Encontrou um erro de digitação ... no modo normal ou no modo visual?
vusan