Wie verbinde ich zwei Zeilen in vi?


169

Ich habe zwei Zeilen in einer Textdatei wie unten:

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

Ich möchte die beiden Zeilen in vi wie folgt anhängen:

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

Die zweite Zeile wurde gelöscht und der Inhalt der zweiten Zeile an die erste Zeile angehängt.

Wie kann ich das im Befehlsmodus in vi machen?

Antworten:


310

Shift+ Jentfernt das Zeilenwechselzeichen aus der aktuellen Zeile. Durch Drücken von "J" an einer beliebigen Stelle in der Zeile können Sie die aktuelle Zeile und die nächste Zeile nach Ihren Wünschen kombinieren.


9
Großbuchstaben J verbindet Zeilen, Kleinbuchstaben

4
Das war ein Großbuchstabe J, kein Kleinbuchstabe J; daher Shift-J.
Jonathan Leffler

28
"Entfernt das Zeilenwechselzeichen aus der aktuellen Zeile" ist eine ziemlich umständliche Methode, um zu beschreiben, was J tut, und ist auch nicht wirklich korrekt. J "verbindet" diese Zeile mit der nächsten. Dabei wird der Zeilenumbruch entfernt, aber auch Leerzeichen auf andere Weise bearbeitet.
Laurence Gonsalves

5
Haha. GJIn vimwechselt zur letzten Zeile und versucht dann, sie mit der nächsten Zeile zu verbinden. Die einzige Stelle, an der ein Join-Befehl keinen Sinn ergibt. Ja, ich fand das lustig :-)
Alok Singhal

2
Ich kann immer noch nicht erkennen, dass ich auf StackOverflow gehen musste, um zwei Zeilen mit diesem Editor zu verbinden!
Manitra Andriamitondra

59

Vi oder Vim?

Auf jeden Fall funktioniert der folgende Befehl für Vim im nicht kompatiblen Modus. Das ist wohl fast reines vi.

:join!

Wenn Sie dies mit dem normalen Befehl tun möchten, verwenden Sie

gJ

Mit 'gJ' verbinden Sie Linien wie sie sind - ohne Leerzeichen hinzuzufügen oder zu entfernen:

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

Ergebnis:

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

Mit dem Befehl 'J' haben Sie:

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

Beachten Sie den Abstand zwischen type>und _ID.


2
Ich möchte nur darauf hinweisen, dass dies g/pattern/joinin VIM g/pattern/Jfunktioniert, während dies nicht der Fall ist. Könnte einigen zukünftigen Menschen helfen.
Jisaacstone

Ich mag Ihre Verbindung mit Muster, aber es verbindet zwei Linien mit Leerzeichen. Wie auch immer, um zwei Linien mit einem Muster ohne Leerzeichen zu verbinden?
David.Chu.ca

g / pattern / join! scheint das zu tun.
Fortboise

1
Kann es bitte komplizierter sein? :-)
Johannes Overmann

22

Dies sollte es tun:

J


6
'J' bietet zusätzlichen Platz beim Verbinden von Linien.
Maxim Kim

3
@ MaximKim: Und deshalb . Beachten Sie, dass :h JSie erfahren, wie Sie diese Funktion deaktivieren.
am

2
Verwenden gJSie diese
Option,

17

In vi J(das ist Shift+ J) oder :joinsollte zum größten Teil tun, was Sie wollen. Beachten Sie, dass sie Leerzeichen anpassen. Insbesondere wird in vielen Fällen ein Leerzeichen zwischen den beiden verbundenen Linien angezeigt. Wenn die zweite Linie eingerückt ist, wird diese Einrückung vor dem Verbinden entfernt.

In Vim können Sie auch gJ( G, dann Shift+ J) oder verwenden :join!. Diese verbinden Linien, ohne Leerzeichen anzupassen.

:help JWeitere Informationen finden Sie in Vim .


Ein Nachteil bei der Verwendung gJund Jist , dass sowohl chang der Cursor an den Verbindungspunkt, aber :join!und :jointun sie nicht.
SergioAraujo

4

Ersetzen Sie einfach das " \n" durch "".

In vi / Vim für jede Zeile im Dokument:

%s/>\n_/>_/g

Wenn Sie jeden Austausch bestätigen möchten:

%s/>\n_/>_/gc

3

Wenn Sie die ausgewählten Linien verbinden möchten (Sie befinden sich im visuellen Modus), drücken gJSie einfach , um Ihre Linien ohne Leerzeichen zu verbinden.

Dies wird auf der vi / Vim Stack Exchange-Site ausführlicher beschrieben .


1

Drücken Sie in der ersten Zeile Shift+ 4("$") und dann Shift+ j("J").

Und wenn Sie Hilfe benötigen, gehen Sie zu vi und drücken Sie F1.


3
$ bewegt sich zum Ende der Zeile, aber es ist nicht notwendig für J

1
Sie müssen nicht am Ende der Zeile stehen, damit J Zeilen verbindet.
Jonathan Leffler

1
Das Drücken von $ ist eigentlich nicht notwendig.
Laurence Gonsalves

1
@laurence .pressing $ stellt sicher, dass der Cursor direkt neben der neuen Liniencharter steht und dies ein Muss ist.
Vijay


1

Eine andere Möglichkeit, zwei Zeilen zu verbinden, ohne den Cursor auf diese Zeile zu setzen, ist:

:6,6s#\n##

Hier ist 6 die Zeilennummer, mit der eine weitere Zeile verbunden wird. Verwenden Sie zum Anzeigen der Zeilennummer :set nu.

Wenn wir uns auf dem Cursor befinden, an dem die nächste Zeile verbunden werden soll, dann:

:s#\n##

In beiden Fällen brauchen wir nicht gwie :s#\n##g, weil in einer Zeile nur eine \nexistiert.


Es ist einfacher Shift+V, alle Zeilen auszuwählen, die verbunden werden sollen, mit Ausnahme der letzten, und :'<,'>s/\n/, /in diesem Beispiel die Zeilen zu verbinden, während am Ende jeweils ein Komma und ein Leerzeichen eingefügt werden. Beachten Sie, dass, wenn etwas ausgewählt ist und wir :im normalen Modus tippen , das '<,'>automatisch in der Befehlszeile angezeigt wird.
Evgeni Sergeev

Gut für ausgewählte mehrzeilige Verknüpfungen mit bevorzugtem Trennzeichen. Einen Tippfehler gefunden ... im normalen Modus oder im visuellen Modus?
Vusan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.