在 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 + w、Up/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
+ w
,s
。
对我来说,它拆分了窗口,但打开了完全相同的文件。那你如何选择打开哪个文件呢?我已经看到命令: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
其中<n>
和<m>
是指定行范围的数字(或符号)。
要使用桌面剪贴板,请查看+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://<host>/<relativepath>
才能读取文件。否则它将尝试从本地存储中读取文件。【参考方案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' < 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 和新文件的名称。其实你会看到
:'<,'>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 中将内容从一个文件复制并粘贴到另一个文件的主要内容,如果未能解决你的问题,请参考以下文章