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

Posted

技术标签:

【中文标题】在 vi 中将内容从一个文件复制并粘贴到另一个文件【英文标题】:Copy and paste content from one file to another file in vi 【发布时间】:2011-06-04 23:23:55 【问题描述】:

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

另外,有没有办法剪切粘贴?我试过用谷歌搜索,但大部分资源只涉及复制粘贴。

【问题讨论】:

您确定这不起作用吗?我经常使用它来复制文件之间的行。 那么当我这样做时,我只得到一个引号? 命令 dd 的作用类似于 cut。 【参考方案1】:

既然您已经知道如何剪切/拉动文本,这里有一些将其粘贴回另一个文件的想法:

编辑第一个文件,拉出你想要的文本。然后在 vi (:e /path/to/other/file) 中打开第二个文件并粘贴

在拆分窗口中同时打开两个文件并使用 Ctrl + wUp/Down在它们之间导航> 通过:

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

【讨论】:

我打开了两个腻子窗口,我首先为视觉模式执行“v”,然后选择所有行并为拉动执行“y”,而不是我正在执行 alt+tab 来获取到另一个文件上,当我为 put 执行“p”时,它只打印一个引号。 如果您使用 2 个 putty windows,则必须使用 putty/windows 的方式进行复制/粘贴。这很简单。用鼠标标记你想复制的东西(你不需要做任何其他事情,标记的文本现在被复制到剪贴板。)切换到你的另一个腻子窗口。在 vim 中进入插入模式(点击 i)。点击鼠标右键 - 在腻子窗口中的鼠标右键将粘贴剪贴板中的任何内容。 你正在做的事情不起作用:在 vi 中拉取文本不会将文本放入 Windows 剪贴板,并且拉取缓冲区不会在打开的 vim 实例之间共享。 我不明白最后一点应该做什么:* 从第一个文件中,Ctrl + ws 对我来说,它拆分了窗口,但打开了完全相同的文件。那你如何选择打开哪个文件呢?我已经看到命令:sp myfile 水平拆分并打开指定文件,但是如果我更喜欢垂直拆分窗口该怎么办?【参考方案2】:

如果您在 Windows 上使用 Vim,您可以使用以下方法访问剪贴板(MS 复制/粘贴):

"*dd -- 剪切一行(或3dd剪切三行)

"*yy -- 复制一行(或3yy复制三行)

"*p -- 将行粘贴到光标后的行

"*P -- 将行粘贴到光标前的行

允许您在单独的 Vim 窗口之间或在 Vim 和 PC 应用程序之间粘贴(Notepad、Microsoft Word 等)。

【讨论】:

使用 + 作为跨平台系统剪贴板寄存器(Windows 和 Linux)与 *,后者仅适用于 Windows(+ 在 Windows 中的工作方式与 * 相同)。 截至 2021 年,在 linux (pop_os 20.04) 中,*+ 一样适用于此答案中提到的应用程序,即在 vim 实例和来自 vim 的实例之间复制/粘贴到系统应用程序(vim 8.2,内置剪贴板支持)【参考方案3】:

使用d 的变体如dd 进行剪切。

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

:<n>,<m> w filename

其中&lt;n&gt;&lt;m&gt; 是指定行范围的数字(或符号)。

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

【讨论】:

要使用标记执行此操作,请在要写入文件的文本周围创建两个标记(例如 a 和 b):移动到第一行,ma,移动到最后一行线,mb。然后在使用上述命令时在标记的字母前添加 ':'a,'b w filename 宽线范围的绝佳解决方案!【参考方案4】:

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

"buffer_name,复制到缓冲区。 Y 是 yank 并且 P 是放置。希望对您有所帮助!

【讨论】:

在本地 vi 上通过 ssh 工作,您仍然需要 :r scp://&lt;host&gt;/&lt;relativepath&gt; 才能读取文件。否则它将尝试从本地存储中读取文件。【参考方案5】:

这是一种方法;

启动 Vim 并打开你正在处理的文件 file1。 :e file2 将打开 file2,即您要从中复制行的文件。 找到要复制的行。如果是三行,你点击 3yy :b1 这将切换到缓冲区 1,其中 file1 是 找出你想插入你拉出的行的位置,然后点击p

您也可以同时查看这两个文件。用例如分割屏幕Ctrl + w s.

至于切割,d 切割并将切割的东西放在 yank 缓冲区中。 dd 将“剪切”一行。

【讨论】:

题外话:我如何获得那些键盘按钮之类的东西? @eckes meta.stackexchange.com/questions/26207/… 这两个文件在两个不同的 ssh 服务器上,在 Linux/MacOS 的两个不同终端中,同一个客户端 ssh'es 怎么办?我的意思是,没有可用的腻子,并且无法在一个终端的同一个 vi 会话中打开这两个文件。 如果客户端可以 ssh 到两台服务器,它也可以使用 scp 或 sftp 到那两台服务器。因此,最快的方法是将文件从一台服务器复制到另一台服务器,以便它们驻留在同一台服务器上,按照描述编辑这些文件,并在完成后将文件复制回另一台服务器(如果需要)。 解决了我遇到的问题。感谢您的简洁回答。【参考方案6】:

这些都是很好的建议,但如果您知道另一个文件中文本的位置,请轻松使用 sed。 :r! sed -n '1,10 p' &lt; input_file.txt 这将在光标当前位置的已打开文件中插入 10 行。

【讨论】:

奇怪的是,在 os x 上运行它时,我得到了一个退出代码 1,不知道为什么。 感谢您的建议!我使用 head 而不是 sed 因为我想要前 2 行::r ! head -n2 file.py【参考方案7】:

2017-05 更新:

我刚刚发现如果你在你的vimrc文件中加入下面一行,

设置剪贴板=未命名

那么 Vim 正在使用系统剪贴板。


我刚刚发现 yank 方式不适用于在不同 Vim 实例窗口之间复制内容的方式。 (至少,根据我的 Vim 知识,它不起作用。我不知道是否有其他方法可以使它起作用)。

根据我的测试,yank方式只适用于在同一个窗口中打开多个文件的方式。

如果你想这样做,你最好使用 OS cut-copy-past 方式,例如 Ctrl + x, Ctrl + c(在 Windows 下)。

【讨论】:

【参考方案8】:

在编辑文件时,在你想要开始和结束的地方做标记

ma - 设置a 标记

mb - 设置b 标记

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

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

【讨论】:

【参考方案9】:

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

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

所以,当我处于可视模式时,我选择我想要的行并按 Ctrl + c 然后按 Ctrl + v 在接收文件中插入文本。您也可以使用 "*y,但我认为这有时很难记住。

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

来源:Copy and paste between sessions using a temporary file

【讨论】:

【参考方案10】:
    确保您的 Vim 版本已编译并支持剪贴板 :echo has('clipboard') 应该返回 1 如果它返回0(例如Mac OS X,至少v10.11(El Capitan)、v10.9(小牛队)和v10.8(山狮)-带有缺少剪贴板支持的Vim版本) ,您必须安装支持剪贴板的 Vim 版本,例如通过 brew install vim(安装后不要忘记重新启动终端) 进入视觉模式(V - 多行,v - 普通,或 Ctrlv - 块 -视觉) 选择要复制的行 "*y - 复制选中 "*p - 粘贴复制

PS:

如果需要复制和粘贴一行,您可以将步骤 2-5 替换为 the answer 中的说明JayG 为了方便选择行,您可以将set mouse+=a 添加到您的.vimrc - 它允许您在 Vim 中使用鼠标选择行,而不选择无关元素(如行号等)。注意: 它将阻止将鼠标选择的文本从 Vim 复制到系统剪贴板的能力

【讨论】:

【参考方案11】:

目标:将一个文件的一部分保存到另一个文件中。

解决方案

    选择要保存的文本: 将光标置于您要开始选择的位置 按 v 选择字符或大写 V 选择整行 将光标移动到您要选择的内容的末尾

    将选定的文本保存到新文件。键入 :wSpace 和新文件的名称。其实你会看到

    :'&lt;,'&gt;w new.txt

    然后按回车

【讨论】:

如何从临时文件中粘贴回来。?【参考方案12】:

在同一个 Vim 实例中打开的两个缓冲区(== 文件)之间复制文本没有问题:

只需用 y 拉入一个缓冲区(假设您之前在可视模式下标记了要复制区域),然后用 p 粘贴到另一个缓冲区。只要它们在同一个 Vim 实例中,它也适用于不同的选项卡。

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

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

如果你在两个不同的 Vim 实例中打开这两个文件,那么你必须使用系统剪贴板:在第一个 Vim 实例中,使用 "+y 将文本拉到系统剪贴板中(同样,将区域标记为之前在可视模式下被拉出),然后转到第二个 Vim 并将剪贴板粘贴到那里:"+p

【讨论】:

:tabedit filename 可用于打开目标文件,然后只需 p 即可粘贴您的行。我认为它更快。【参考方案13】:

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

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

【讨论】:

【参考方案14】:

示例:fileA 和 fileB - 从 fileA 的第 25 行开始,复制 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

【讨论】:

【参考方案15】:

以下选项大部分时间都有效,也适用于稍后粘贴。

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

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

在另一个文件中粘贴行,

:e filename&location

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

: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*'中的行将被复制到当前光标位置之后

【讨论】:

【参考方案16】:

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

:linenumber,linenumber write newfile

例子:

:2,34 write temp1

或者

:'mark, 'mark write newfile

例子:

:'a,'b write temp1

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

:linenumber1,linenumber2 d

或者

:'mark1,'mark2 d

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

类型

:r!cat temp1

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

:!rm temp1

如果您想多次复制和粘贴,这会有所帮助。

【讨论】:

【参考方案17】:

另一种方法是在两个拆分缓冲区中打开这两个文件,并在视觉选择感兴趣的行后使用以下“sn-p”。

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

【讨论】:

【参考方案18】:

进入命令模式并运行

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

例如从filename 提取行20-30 到当前打开的文件中

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

【讨论】:

【参考方案19】:

在您的.vimrc 中设置viminfo

set viminfo=%,<1000,'10,/50,:100,h,f0,n~/.viminfo

当您退出 Vim 时,这将在 ~/.viminfo 文件中保留多达 1,000 行被拉取的内容(您的“寄存器”)。它会在您启动 Vim 时恢复,因此您可以将其粘贴到不同的文件中。

请参阅viminfo documentation 了解它可以跨会话持续存在的所有其他内容。

【讨论】:

以上是关于在 vi 中将内容从一个文件复制并粘贴到另一个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何复制vim编辑器中的内容粘贴到另一个终端的编辑器里

如何复制vim编辑器中的内容粘贴到另一个终端的编辑器里

使用vi编辑器修改配置文件时,如何快速复制,粘贴多行文字内容

如何用Vi把一个文件中的几行拷贝到另一个文件中去

在Java中将文件从一个目录复制到另一个目录

在vi中打开多个文件,复制一个文件中多行到另一个文件中