在vi中将内容从一个文件复制并粘贴到另一个文件

我正在处理两个文件,我需要从一个文件复制几行并粘贴到另一个文件。 我知道如何复制(yy)并粘贴(p)在同一个文件中。 但是,这不适用于不同的文件,这是怎么做的?

另外,有没有办法剪贴? 我试过Googlesearch,但大部分资源只是谈论复制粘贴。

既然你已经知道如何剪切/抽出文本,下面是将其粘贴回另一个文件的一些想法:

  • 编辑第一个文件,拉开你想要的文字。 然后从vi( :e /path/to/other/file )中打开第二个文件并粘贴
  • 在分割窗口中将两个文件一起打开,然后使用Ctrl + w向上 / 向下导航它们之间的方法:

    • vi -o /path/to/file1 /path/to/file2
    • 从第一个文件中, Ctrl + ws

如果您在Windows中使用VIM,则可以使用以下命令访问剪贴板(MS复制/粘贴):

* d d – 剪切一条线(或者3dd剪切3条线)

* y y – 复制一行(或3yy复制3行)

* p – 粘贴光标后面的行

* P – 粘贴在光标前面的行

可以在不同的VIM窗口之间或在VIM和PC应用程序(记事本,单词等)之间进行粘贴。

使用像dd这样的变化来切割。

要将一系列行写入另一个文件,您可以使用:

 :<n>,<m> w filename 

其中<n><m>是指定一系列行的数字(或符号)。

要使用桌面剪贴板,请查看+g命令。

您可以打开另一个文件并键入:r file_to_be_copied_from 。 或者你可以缓冲。 或者转到第一个文件,select要复制的行,input"qY ,转到要粘贴的文件并input"qP

" buffer_name,拷贝到缓冲区, Y被抽出, P被放入,希望有帮助!

这是一个办法。

  • 启动VIM并打开您正在处理的文件file1。
  • E文件2,这将调出文件2,您要复制行的文件。
  • find你想要复制的行,如果是3行,那么你打3
  • b 1这将切换到缓冲区1,其中file1是
  • 找出你要插入你所抽出的线条,然后点击p

你可以同时看到两个文件,例如按CTRL + W s分割屏幕

至于切割,切割,并将切割的东西放在扬克缓冲区。 d d将“切断”一条线。

这些都是很好的build议,但如果你知道在另一个文件中的文本的位置使用sed很容易。 :r! sed -n '1,10 p' < input_file.txt :r! sed -n '1,10 p' < input_file.txt这将在光标当前位置的已经打开的文件中插入10行。

在编辑文件的同时,在要开始和结束的地方使用标记

ma – 设置a标志

mb – 设置b标志

然后,将其复制到另一个文件中,只需使用w命令:

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

在VIM的同一个实例中打开的两个缓冲区(==文件)之间复制文本是没有问题的:只需在y中插入一个缓冲区(假设之前在可视模式中标记了一个复制区域),然后粘贴到另一个缓冲区与p 。 也可以使用不同的选项卡,只要它们在VIM的同一个实例中即可。

如何在VIM的同一实例中打开两个文件取决于您的系统:

  • 在Win32上,如果select两个或多个文件,则在上下文菜单中有一个选项, 用一个vim编辑
  • 当你在控制台上,你可以用vim file1 file2来实现它
  • 如果您使用VIM作为另一个工具的编辑器,请务必指定--remote-silent选项以确保所有文件都在相同的实例中打开

如果您在两个不同的VIM实例中打开这两个文件,那么您必须使用系统剪贴板:在第一个VIM中,使用"+y将文本拖放到系统剪贴板中(同样,将区域标记为可视化模式),然后进入第二个VIM并粘贴剪贴板: "+p

我的场景是我需要复制中间n行,从未知文件1到文件2。

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

这些重映像对我来说就像一个魅力:

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

因此,当我处于可视模式时,我select我想要的行,然后按Ctrl + c,然后按Ctrl + v将文本插入到接收器文件中。 你也可以使用“* y”,但是我觉得有时候这很难记住。

这对从vim复制文本到剪贴板也很有用。

来源: http : //vim.wikia.com/wiki/Copy_and_paste_between_sessions_using_a_temporary_file

在这里没有find简单的答案,所以我张贴我自己的。

目标 :将一个文件保存到另一个文件。

解答

  1. select您要保存的文本:
    • 将光标定位在要开始select的位置
    • vselect字符或大写字母Vselect整行
    • 将光标移到要select的内容的末尾
  2. 将选定的文本保存到新文件。 键入 w 空格和新文件的名称。 其实你会看到的

    :'<,'>w new.txt

    然后按Enter键

201705更新:

我刚刚发现,如果你添加以下行到你的vimrc文件中,

设置剪贴板=未命名

那么VIM正在使用系统剪贴板


我刚刚发现,在不同的VIM实例窗口之间复制内容的方式不能工作。 (至less,不能基于我的VIM知识工作,我不知道是否有另一种方法来使其工作)。

只有在根据我的testing在同一个窗口中打开多个文件的方式下才能使用这种方式。

如果你想这样做,你最好使用操作系统剪切复制过去的方式,如CTRL + X,CTRL + C(在Windows下)。

例如:fileA和fileB – 从第25行的fileA开始,复制50行,并粘贴到fileB

 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 

下面的选项大部分时间都适用,也可以稍后粘贴。

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

被抽出的行将被存储在缓冲区'x' 。 它可以在编辑中的任何地方使用。

要将行粘贴到另一个文件中,

 :e filename&location 

示例:在当前编辑中input以下命令

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

完成操作

打开文件1:

 vi Test1.sh a10yy -Yanked 10 lines 

– 从当前编辑中打开第二个文件

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

将光标移动到您必须粘贴的行

 *"ap* 

– 缓冲区'*a*'会在当前光标位置后被复制

另一种方法是在两个拆分缓冲区中打开这两个文件,并在可视化select感兴趣的行之后使用以下“代码段”。

 :vnoremap <F4> :y<CR><CW>Wr<Esc>p 
  1. 确保你有剪贴板支持编译的Vim版本
    • :echo has('clipboard')应该返回1
    • 如果它返回0 (例如OSX,至lessEl Capitan,Mavericks和Mountain Lion–带有Vim版本,缺less对剪贴板的支持),则必须安装带有剪贴板支持的Vim版本,例如通过brew install vim (请不要忘记安装后重新启动您的terminal)
  2. 进入一个视觉模式( V – 多行, V – 平原,或Ctrl V – 块视觉)
  3. select您想要复制的行
  4. * y – 复制选中
  5. * p – 粘贴复制

PS:

  • 如果您需要复制并粘贴一行 ,您可以用JayG 的答案replace第2-5步
  • 为了简化select,你可以在你的.vimrc添加set mouse+=a ,它允许你使用鼠标在vim中select行,而不是select无关的元素(如行号等)。 注意:从Vim中select文本到系统剪贴板

如果要复制文件的一部分并将该内容粘贴到另一个文件的中间,可以这样做。

 :linenumber,linenumber write newfile 

例:

 :2,34 write temp1 

要么

 :'mark, 'mark write newfile 

例:

 :'a,'b write temp1 

现在行被复制到另一个文件。 如果你想在复制后删除这些行,你可以这样做

 :linenumber1,linenumber2 d 

要么

 :'mark1,'mark2 d 

现在,转到其他文件。 然后将光标保持在要粘贴的行上。

types

 :r!cat temp1 

现在,临时文件的内容被粘贴在这里。 粘贴内容后,可以从命令行中删除临时文件。

 :!rm temp1 

这将有助于如果你想复制和粘贴多次。