使用vim复制文件中特定行的方法

3

请问如何复制文件中的特定行,例如第10-20行、22行、24-30行,以便将其粘贴到另一个文件中?我看到了这篇stackoverflow帖子,但是我的问题不同。

4个回答

4

这是一个有趣的小想法。将以下内容粘贴到您的~/.vimrc文件中:

command! -nargs=* Y :call YankList(<f-args>)
fun! YankList(...)
   let yanklist = []
   for i in a:000
      if match(i, "-") != -1
         let split = split(i, "-")
         let yanklist = yanklist + range(split[0], split[1])
      else
         let yanklist = yanklist + i
      endif
   endfor
   call setreg('"', "")
   for i in yanklist
      call setreg('"', getline(i), "al")
   endfor
endfun

现在你可以指定要复制到未命名寄存器的行。因此,请执行以下操作:
:Y 10-20 22 24-30

使用p命令将它们粘贴到您想要它们的位置。(包括)

尽管这是一篇旧文章,我仍想对其进行编辑,以建议更“vimmy”地完成此操作。请参阅:help usr_10 | 131

您可以执行以下操作:

10GV20G"ay
22G"AY
24GV30G"Ay
G"ap

此外,如果每行都包含某个特定的模式,那么您可以通过该模式抓取它们。例如,假设我想要获取所有包含单词“foo”的行,则可以执行以下操作:
:g/foo/y "

3

这里有一个使用寄存器的简单解决方案。

根据你提供的场景,需要复制第10-20行、22行和24-30行。

只需用"A"复制每个组。

:10,20y A

:22y A

:24,30y A

此时,你已经将每个组的行复制到了"A"寄存器。现在你可以像往常一样使用p粘贴,或者使用"Ap(双引号,寄存器字母,然后p)仅粘贴你使用A寄存器复制的内容。

了解更多关于寄存器的信息在这里在这里


2
使用可视化模式,或直接操作:
:10,20yank

复制到新文件:

:new | put | 0d

通常情况下,您会有一个标准,例如将包含“pattern”的所有行移动到末尾:
:g/pattern/m$

复制(:copy或:t)

:g/pattern/t$

将内容复制到寄存器:

:let @a="" | g/pattern/y A

现在,你可以在任何地方使用它,例如"aP以粘贴它。
如果没有可用的模式,请使用文本动作,例如}:y A将一块行附加到下一个空行,注册a等。
编辑 PS. 我想解释一下为什么我会提到m$移动到结尾(这是我个人最喜欢的方法):
如果您选择将行移动/复制到文件末尾(m$),则可以立即将它们写入另一个文件。例如:
 :$mark a
 :g/pattern/t$
 :'a,$w newfile.txt

复制与文件newfile.txt匹配的行。现在从源文件中删除副本:

 :'a,$d

1

同时打开两个文件 - 直接从命令行调用 vim fileone filetwo 或者打开 vim 然后输入 :e file。你可以使用缓冲区命令在它们之间切换,对于两个文件,:bn:bp 是等效的(缓冲区下一个,上一个)。然后只需复制这些行。

这可以很容易地完成:10G 跳转到第 10 行,y10y 复制接下来的十行,然后 :bnp 将其粘贴到另一个文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接