我有一个长这样的文件:
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"中,我只想要特定的列。谢谢。
我有一个长这样的文件:
1 148 1 4
2 333 1 3
3 534 2 3
4 772 g 7
5 921 p 2
1 148 1
2 333 1
3 534 2
4 772 g
5 921 p
我可以从vim命令行完成这个操作吗?如果我输入
:1,5ya a
您可以通过命令行执行任何命令,这里使用:normal
来帮助您:
:execute "normal! 1G^\<C-v>6l5j\"ay"
这会创建一个块选择,然后将其复制到寄存器a中。使用:execute
命令可以使用\<C-v>
符号而不是直接插入它。它还允许您用变量替换硬编码的限制。
:y
是一个按行处理的命令 - 它只影响整行。你需要的是按块处理。按块处理的命令涉及可视模式。因此,你能做的最好的事情是:
"ay
将所选文本复制到寄存器a
中。虽然不太常规,但这应该可以工作:
:1,5y|put|-4,.s/\(.\{7\}\).*/\1/|-4,.d a
:let @a = join(map(getline(1, 5), 'matchstr(v:val, ".*\\%<9v")'), "\n")
它将行作为列表 (getline()
) 检索,然后通过特殊的 /\%<v
正则表达式原子匹配前7个虚拟列,并将其 (join()
作为字符串) 分配给寄存器 @a
。
我会这样做
然后就完成了(从文档顶部开始用gg)
当然,如果您想要放在寄存器a中,请添加"a
:
6l4j
应该可以解决问题(假设您在块的左上角)。 - bitmask