我有一个文件,我想做以下事情。
- copy every n lines starting from m (m,m+n,m+2n, ...)
- copy line number 2, 5, 27, ... by specifying line numbers.
感谢
答案 0 :(得分:7)
要复制每N行,您可以使用带有选择行的表达式的:global
:
:let @a = ''
:g/^/if line('.') % 3 == 0 | yank A | endif
对于显式行,我会依次调用:yank
命令:
2yank a | 5yank A | 27yank A
这使用yanking进入大写寄存器以附加到它。
答案 1 :(得分:1)
除了:g
解决方案,Ingo发布,您还可以使用:s
命令。
首先,您需要准备模式。例如,明确匹配每三行,
您可以使用模式\%3l\|\%6l\|\%9l
等
首先让我们将生成的模式保存在变量中(为了简化它,我们只考虑前100行):
:let lines=range(3,100,3)
这将创建一个包含所有行号的列表,从3开始并递增3,注意,如果您需要一些不遵循任何arithemtic规则的特殊行号,只需将列表定义为:
:let lines=[2,5,26,57,99]
然后我们需要从中生成一个模式,我们可以在:s
命令中使用它:
:call map(lines, '''\%''.v:val.''l''')
这会将行号转换为\%
号 l
形式的模式。因此,我们有一个匹配每个所需行的模式,但首先我们需要初始化结果列表变量:
:let result = []
我们现在可以将其提供给:s
命令:
:exe ":%s/". join(lines, '.*\|'). '/\=add(result, submatch(0))/n'
所有匹配的行现在都包含在列表result
中,例如使用以下方法复制到剪贴板:
:let @+=join(result, "\n")
或者您可以将其粘贴到暂存缓冲区中:
:new +exe\ append(0,result)
(注意,exe和append call之间的空格需要转义)。
请注意,此解决方案至少需要Vim Patch 7.3.627
根据具体情况,我会使用这种方法或Ingo指出的方法。