it-swarm.com.de

Kopieren Sie den Inhalt von einer Datei in eine andere in vi

Ich arbeite mit zwei Dateien, ich muss einige Zeilen aus einer Datei kopieren und in eine andere Datei einfügen. Ich weiß, wie man kopiert (yy) und in dieselbe Datei einfügt (p). Das funktioniert aber nicht für verschiedene Dateien, wie wird das gemacht?

Gibt es auch eine Möglichkeit zum Ausschneiden und Einfügen? Ich habe Googeln ausprobiert, aber die meisten Ressourcen beziehen sich nur auf das Kopieren und Einfügen.

218
macha

Da Sie bereits wissen, wie man Text ausschneidet/reißt, finden Sie hier einige Ideen, um ihn wieder in eine andere Datei einzufügen:

  • Bearbeiten Sie die erste Datei und ziehen Sie den gewünschten Text heraus. Öffnen Sie dann Ihre zweite Datei in vi (:e /path/to/other/file) und fügen Sie sie ein
  • Öffnen Sie beide Dateien zusammen in einem geteilten Fenster und navigieren Sie zwischen ihnen mit Ctrl + wUp/Down entweder von:

    • vi -o /path/to/file1 /path/to/file2
    • Aus der ersten Datei heraus Ctrl + ws
192
Adam Batkin

Wenn Sie VIM unter Windows verwenden, können Sie auf die Zwischenablage zugreifen (MS Copy/Paste), indem Sie Folgendes verwenden:

"*dd - schneiden Sie eine Linie (oder 3dd, um 3 Linien zu schneiden)

"*yy - kopiere eine Zeile (oder 3yy um 3 Zeilen zu kopieren)

"*p - Zeile (n) in Zeile nach dem Cursor einfügen

"*P - Zeile (n) vor dem Cursor einfügen

Mit können Sie zwischen separaten Fenstern VIM oder zwischen VIM und PC-Anwendungen (Editor, Word usw.) einfügen.

46
JayG

Verwenden Sie die Variationen von d wie dd zum Schneiden.

Um einen Zeilenbereich in eine andere Datei zu schreiben, können Sie Folgendes verwenden:

:<n>,<m> w filename

Dabei sind <n> und <m> Zahlen (oder Symbole), die einen Zeilenbereich angeben.

Um die Desktop-Zwischenablage zu verwenden, werfen Sie einen Blick auf die +g-Befehle.

36
Apalala

Hier ist eine Möglichkeit, dies zu tun.

  • Starten Sie vim und öffnen Sie file1, die Datei, an der Sie arbeiten.
  • :e file2 öffnet file2, die Datei, aus der Sie Zeilen kopieren möchten.
  • suchen Sie die Zeilen, die Sie kopieren möchten. Wenn es 3 Zeilen sind, drücken Sie 3yy
  • :b1 Dies wechselt zu Puffer 1, in dem sich Datei1 befindet
  • finden Sie heraus, wo Sie die gezerrten Linien einfügen möchten, und drücken Sie p

Sie können auch beide Dateien anzeigen lassen und den Bildschirm mit z. CTRL + ws

Was das Schneiden betrifft, d schneidet und legt das geschnittene Zeug in den Ruckpuffer. dd wird eine Linie "schneiden".

25
nos

Sie können die andere Datei öffnen und :r file_to_be_copied_from eingeben. Oder du kannst puffern. Oder gehen Sie zur ersten Datei, gehen Sie in die Zeile, die Sie kopieren möchten, geben Sie "qY ein, gehen Sie zu der Datei, die Sie einfügen möchten, und geben Sie "qP ein.

"buffer_name, kopiert in den Puffer. Y ist Ruckeln und P wird gesetzt. Hoffentlich hilft das!

21
Win Man

Dies sind alles gute Vorschläge, aber wenn Sie wissen, wo sich der Text in einer anderen Datei befindet, verwenden Sie sed einfach. :r! sed -n '1,10 p' < input_file.txt Damit werden 10 Zeilen in eine bereits geöffnete Datei an der aktuellen Position des Cursors eingefügt.

14
malik

Markieren Sie während der Bearbeitung der Datei, wo der Anfang und das Ende verwendet werden sollen 

ma - setzt die Markierung a

mb - setzt die Markierung b

Um dies in eine andere Datei zu kopieren, verwenden Sie einfach den Befehl w:

:'a,'bw /name/of/output/file.txt
7
vman

Diese Remaps wirken für mich wie ein Zauber:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

Wenn ich mich im visuellen Modus befinde, wähle ich die gewünschten Zeilen aus und drücke Strg + c und dann Strg + v, um den Text in die Empfängerdatei einzufügen. Sie könnten "* y auch verwenden, aber ich denke, das ist manchmal schwer zu merken.

Dies ist auch nützlich, um Text aus vim in die Zwischenablage zu kopieren. 

Quelle: http://vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file

5
rovitulli

Habe hier keine einfache Antwort gefunden, also poste ich meine eigene.

Ziel: Speichert einen Teil einer Datei in einer anderen Datei.

Lösung:

  1. Wählen Sie den zu speichernden Text aus:
    • Positionieren Sie den Cursor an der Stelle, an der Sie mit der Auswahl beginnen möchten
    • Drücken Sie v zur Auswahl von Zeichen OR in Großbuchstaben V ganze Zeilen auswählen
    • Bewegen Sie den Cursor an das Ende dessen, was Sie auswählen möchten
  2. Speichern Sie den ausgewählten Text in der neuen Datei. Art :wSpace und den Namen der neuen Datei. Eigentlich wirst du sehen

    :'<,'>w new.txt

    Dann drücken Enter

4
Lu55

201705 Update:

Ich habe gerade festgestellt, dass, wenn Sie folgende Zeile in Ihre Vimrc-Datei einfügen,

set Zwischenablage = unbenannt

dann verwendet VIM die Systemzwischenablage


Ich habe gerade festgestellt, dass der Ruckweg auf dem Weg, auf dem ich Inhalte zwischen verschiedenen VIM - Instanzfenstern kopiere, nicht funktioniert. (Zumindest funktioniert es nicht auf Grundlage meines VIM - Wissens. Ich weiß nicht, ob es eine andere Möglichkeit gibt, damit es funktioniert). 

Das Ruckeln funktioniert nur auf dem Weg, bei dem gemäß meinem Test mehrere Dateien im selben Fenster geöffnet werden.

Wenn Sie dies tun möchten, sollten Sie das Ausschneiden-Kopieren-Über-Verfahren des Betriebssystems wie Strg + X, Strg + C (unter Windows) verwenden.

4
Lichader

Das Kopieren von Text zwischen zwei Puffern (== Dateien), die in derselben Instanz von VIM geöffnet werden, ist kein Problem: Einfach in einen Puffer mit ziehen y (vorausgesetzt, Sie haben zuvor im visuellen Modus einen zu kopierenden Bereich markiert), und fügen Sie ihn dann mit in den anderen Puffer ein p. Funktioniert auch mit verschiedenen Registerkarten, sofern diese sich in derselben Instanz von VIM befinden.

Wie zwei Dateien in derselben Instanz von VIM geöffnet werden, hängt von Ihrem System ab:

  • Unter Win32 gibt es eine Option im Kontextmenü, die Mit einem VIM bearbeiten sagt, wenn Sie zwei oder mehr Dateien auswählen
  • Wenn Sie sich an der Konsole befinden, können Sie dies mit vim file1 file2 erreichen.
  • Wenn Sie VIM als Editor für ein anderes Tool verwenden, müssen Sie die Option --remote-silent angeben, um sicherzustellen, dass alle Dateien in derselben Instanz geöffnet werden

Wenn Sie die beiden Dateien in zwei verschiedenen Instanzen von VIM geöffnet haben, müssen Sie die Systemzwischenablage verwenden: In der ersten VIM ziehen Sie den Text mit "+y in die Systemzwischenablage (markieren Sie den Bereich, der zuvor im visuellen Modus gezogen werden soll) ), dann gehe zum zweiten VIM und füge die Zwischenablage dort ein: "+p.

4
eckes

Mein Szenario war, dass ich n Anzahl der Zeilen in der Mitte (n unbekannt) von Datei 1 in Datei 2 kopieren muss.

:'a,'bw /name/of/output/file.txt
3
Shyam S

Beispiel: fileS und file - beginnen Sie in file bei Zeile 25, kopieren Sie 50 Zeilen und fügen Sie sie in fileB ein

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp
1
Brenda

Rufen Sie den Befehlsmodus auf und starten Sie

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

Z. B. Zeilen 20-30 aus filename in die aktuell geöffnete Datei extrahieren

:r! sed -n '20, 30p' filename
0
Anthony Awuley

Wenn Sie einen Teil einer Datei kopieren und diesen Inhalt in die Mitte einer anderen Datei einfügen möchten, können Sie dies auf diese Weise tun.

:linenumber,linenumber write newfile

Beispiel: 

:2,34 write temp1

Oder

:'mark, 'mark write newfile

Beispiel:

:'a,'b write temp1

Jetzt werden die Zeilen in eine andere Datei kopiert. Wenn Sie diese Zeilen nach dem Kopieren löschen möchten, können Sie dies tun

:linenumber1,linenumber2 d

Oder 

:'mark1,'mark2 d

Gehen Sie jetzt zu einer anderen Datei. .__ Halten Sie den Cursor in der Zeile, in der Sie einfügen möchten.

Art

:r!cat temp1

Nun wird der Inhalt der temporären Datei hier eingefügt. Sie können die temporäre Datei nach dem Einfügen des Inhalts von der Befehlszeile selbst löschen.

:!rm temp1

Dies würde helfen, wenn Sie mehrmals kopieren und einfügen möchten. 

0
SibiCoder

Eine andere Möglichkeit besteht darin, die beiden Dateien in zwei aufgeteilten Puffern zu öffnen und nach der visuellen Auswahl der interessierenden Zeilen das folgende "Snippet" zu verwenden.

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p
0
Thorsten

Die unten stehende Option funktioniert meistens und auch zum späteren Einfügen.

 "xnyy
x - buffer name
n - number of line to Yank - optional

Die abgerufenen Zeilen werden im Puffer 'x'..__ abgelegt und können überall in der Bearbeitung verwendet werden.

Um die Zeile (n) in die andere Datei einzufügen,

:e filename&location

Beispiel: Geben Sie den folgenden Befehl in die aktuelle Bearbeitung ein

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

Komplette Bedienung

Datei 1 öffnen:

vi Test1.sh

a10yy

-Yanked 10 lines

-nicht öffnen Sie die zweite Datei aus der aktuellen Bearbeitung

*:e /u/test/Test2.sh*

- Bewegen Sie den Cursor in die Zeile, in die Sie einfügen müssen

*"ap*

- Zeilen aus dem Puffer '*a*' werden nach der aktuellen Cursorposition kopiert

0
Raams
  1. Stellen Sie sicher, dass Ihre Vim-Version mit Unterstützung für die Zwischenablage kompiliert ist
    • :echo has('clipboard') sollte 1 zurückgeben
    • wenn 0 zurückgegeben wird (z. B. OSX, mindestens El Capitan, Mavericks und Mountain Lion - mit Vim-Version ohne Zwischenablage-Unterstützung), müssen Sie die Vim-Version mit Zwischenablage-Unterstützung installieren, z. B. über brew install vim (vergessen Sie nicht, Ihre neu zu starten Terminal (s) nach der Installation)
  2. Rufen Sie einen visuellen Modus auf (V - mehrzeilig, v - schlicht oder Ctrlv - Block-Visual)
  3. Wählen Sie die zu kopierenden Zeilen aus
  4. "*y - Auswahl kopieren
  5. "*p - kopiert einfügen

P.S:

  • sie können die Schritte 2-5 durch die Anweisungen von die Antwort durch JayG ersetzen, wenn Sie eine einzelne Zeile kopieren und einfügen müssen
  • um die Auswahl von Zeilen zu vereinfachen, können Sie set mouse+=a zu Ihrem .vimrc hinzufügen. Dadurch können Sie Zeilen in vim mit der Maus auswählen, ohne dabei überflüssige Elemente (wie Zeilennummern usw.) auszuwählen. HINWEIS: Es wird blockiert Möglichkeit, mit der Maus ausgewählten Text aus Vim in die System-Zwischenablage zu kopieren
0
Filipp W.