Comment joindre deux lignes dans vi?


169

J'ai deux lignes dans un fichier texte comme ci-dessous:

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

Je veux ajouter les deux lignes dans vi comme ci-dessous:

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

La deuxième ligne a été supprimée et le contenu de la deuxième ligne a été ajouté à la première ligne.

Comment pourrais-je le faire en utilisant le mode commande dans vi?

Réponses:


310

Shift+ Jsupprime le caractère de changement de ligne de la ligne actuelle, donc en appuyant sur "J" à n'importe quel endroit de la ligne, vous pouvez combiner la ligne actuelle et la ligne suivante comme vous le souhaitez.


9
J majuscule j joint les lignes, minuscule déplace le curseur

4
C'était un J majuscule, pas un J minuscule; d'où Shift-J.
Jonathan Leffler

28
"supprime le caractère de changement de ligne de la ligne courante" est une manière assez maladroite de décrire ce que fait J, et n'est pas non plus vraiment correcte. J "joint" cette ligne à la suivante. Dans le processus, il supprime la nouvelle ligne, mais manipule également les espaces blancs d'autres manières.
Laurence Gonsalves

5
Haha. GJin vimse déplacera à la dernière ligne puis essaiera de la joindre à la ligne suivante, le seul endroit où une commande de jointure n'aura pas de sens. Ouais, j'ai trouvé ça drôle :-)
Alok Singhal

2
Je n'arrive toujours pas à réaliser que j'avais besoin d'aller sur StackOverflow pour joindre deux lignes en utilisant cet éditeur!
Manitra Andriamitondra

59

Vi ou Vim?

Quoi qu'il en soit, la commande suivante fonctionne pour Vim en mode «nocompatible». C'est, je suppose, presque pur vi.

:join!

Si vous voulez le faire à partir d'une utilisation normale de la commande

gJ

Avec 'gJ', vous joignez les lignes telles quelles - sans ajouter ni supprimer d'espaces:

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

Résultat:

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

Avec la commande 'J', vous aurez:

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

Notez l'espace entre type>et _ID.


2
Je veux juste souligner que cela g/pattern/joinfonctionne dans VIM alors que ce g/pattern/Jn'est pas le cas. Pourrait aider certaines personnes futures.
jisaacstone

J'aime votre jointure avec un motif, cependant, il joint deux lignes avec un espace blanc. Quoi qu'il en soit pour joindre deux lignes avec un motif sans espace blanc?
David.Chu.ca

g / motif / jointure! semble faire cela.
fortboise

1
Cela peut-il être plus compliqué, s'il vous plaît! :-)
Johannes Overmann

22

Cela devrait le faire:

J


6
«J» donne un espace supplémentaire lors de la jonction des lignes.
Maxim Kim

3
@MaximKim: Et c'est pourquoi . Notez que :h Jcela vous dira comment désactiver cette fonctionnalité.
ereOn

2
À utiliser gJsi vous ne voulez pas que vim ajoute un espace lors de la jonction des lignes
qwertzguy

17

En vi, J(c'est Shift+ J) ou :joindevrait faire ce que vous voulez, pour la plupart. Notez qu'ils ajustent les espaces. En particulier, vous vous retrouverez avec un espace entre les deux lignes jointes dans de nombreux cas, et si la deuxième ligne est indentée, cette indentation sera supprimée avant la jointure.

Dans Vim, vous pouvez également utiliser gJ( G, puis Shift+ J) ou :join!. Ceux-ci joignent les lignes sans effectuer de réglage des espaces.

Dans Vim, voir :help Jpour plus d'informations.


Une mise en garde lors de l'utilisation de gJet Jest que les deux modifient le curseur au point de jonction, mais :join!et :joinne le font pas.
SergioAraujo

4

Remplacez simplement le " \n" par "".

Dans vi / Vim pour chaque ligne du document:

%s/>\n_/>_/g

Si vous souhaitez confirmer chaque remplacement:

%s/>\n_/>_/gc

3

Si vous souhaitez joindre les lignes sélectionnées (vous êtes en mode visuel), appuyez simplement sur gJpour joindre vos lignes sans aucun espace.

Ceci est décrit plus en détail sur le site vi / Vim Stack Exchange .


1

Appuyez sur Shift+ 4("$") sur la première ligne, puis sur Shift+ j("J").

Et si vous voulez de l'aide, allez dans vi, puis appuyez sur F1.


3
$ se déplace à la fin de la ligne, mais ce n'est pas nécessaire pour J

1
Vous n'avez pas besoin d'être à la fin de la ligne pour que J rejoigne les lignes.
Jonathan Leffler

1
En fait, il n'est pas nécessaire d'appuyer sur $.
Laurence Gonsalves

1
@laurence .pressing $ garantit que le curseur est placé juste à côté de la nouvelle charte de ligne et c'est un must.
Vijay

1

Dans Vim, vous pouvez également utiliser gJ.

ََ


1

Une autre façon de joindre deux lignes sans placer le curseur sur cette ligne est:

:6,6s#\n##

Ici 6 est le numéro de ligne auquel une autre ligne sera jointe. Pour afficher le numéro de ligne, utilisez :set nu.

Si nous sommes sur le curseur à l'endroit où la ligne suivante doit être jointe, alors:

:s#\n##

Dans les deux cas, nous n'avons pas besoin de glike :s#\n##g, car sur une seule ligne, une seule \nexiste.


Il est plus facile d'utiliser Shift+Vpour sélectionner toutes les lignes qui doivent être jointes, sauf la dernière, puis :'<,'>s/\n/, /dans cet exemple, joindre des lignes en mettant une virgule et un espace à la fin de chacune. Notez que lorsque quelque chose est sélectionné et que nous tapons :en mode normal, le '<,'>apparaît automatiquement sur la ligne de commande.
Evgeni Sergeev

Bon pour la jointure de lignes multiples sélectionnée avec le délimiteur préféré. Vous avez trouvé une faute de frappe ... en mode normal ou en mode visuel?
vusan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.