我有一个看起来像这样的文件:
1 148 1 4
2 333 1 3
3 534 2 3
4 772 g 7
5 921 p 2
我想从第1行到第5行以及从第1列到第7行抽取文本:
1 148 1
2 333 1
3 534 2
4 772 g
5 921 p
我可以从vim命令行执行此操作吗?如果我输入
:1,5ya a
整条线被拉入注册“a”,我只想要某些列。
感谢。
答案 0 :(得分:2)
您可以在:normal
的帮助下在命令行上执行任何命令:
:execute "normal! 1G^\<C-v>6l5j\"ay"
这会构建一个块顺序选择,然后将其拉出来注册a。使用:execute
以便可以使用\<C-v>
表示法而不是字面插入它。它还允许您用变量替换硬编码限制。
答案 1 :(得分:1)
您不能以简单的方式从vim命令行执行此操作。 :y
是 linewise 命令 - 它只影响整行。您正在寻找的是 blockwise 。块状命令涉及可视模式。所以你能做的最好的事情是:
"ay
将突出显示的文字放入注册a
。答案 2 :(得分:0)
不是很普通,但这应该有效:
:1,5y|put|-4,.s/\(.\{7\}\).*/\1/|-4,.d a
Yank 5行,放(复制)它们,删除所需列后的所有内容,将它们删除到缓冲区中。
答案 3 :(得分:0)
另一种方法,更适合脚本:
:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")
它将行检索为List(getline()
),然后通过特殊的/\%<v
正则表达式原子匹配前7个虚拟列,并将其(join()
ed指定为字符串)到寄存器@a
。
答案 4 :(得分:0)
我会做
并完成(从 g g 的文档顶部开始)
当然,如果您想要注册 a ,请添加"a
: