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?

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.


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.


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


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.


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

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 .


1

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

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


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

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.


É 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.