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?

Vijay
la source

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.

GJ.
la source
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.

Maxim Kim
la source
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

samg
la source
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.

Laurence Gonsalves
la source
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
Carsten C.
la source
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 .

Brad Parks
la source
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.

ghostdog74
la source
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.

ََ

joshy
la source
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.

Vusan
la source
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