文件.txt
abc123
456efg
hi789j
命令
:set hlsearch
/\d\+
我想将下面突出显示的文本复制到剪贴板(或注册):
123
456
789
就像
egrep -o '[0-9]+' file.txt
谢谢。
最佳答案
可以按照以下步骤操作。
清空寄存器(例如,
"a
)。qaq
或
:let @a = ''
运行命令1
:g/\d\+/norm!//e^Mv??^M"Ay
如果需要在每个字符后面追加一个换行符 匹配,则运行此命令:2
:g/\d\+/norm!//e^Ma^M^[??^Mv$"Ayu
输入
^M
作为 Ctrl+V 然后 Enter (或 Ctrl+M),输入^[
作为 Ctrl+V 然后 Esc (或 Ctrl+[)。为了不重新输入模式 刚刚在搜索中使用过的,可以按 Ctrl+R、/ 自动插入 最后的搜索模式。还可以记录在匹配行上执行的命令(部分 遵循
规范!
)作为宏。这允许查看操作 立即在 sample 线上进行测试并确保它们是正确的。然后, 可以使用:global
应用宏::g/\d\+/norm!@z
1 在顶层,该命令是执行 Ex 的 :global
在与模式匹配的每行上命令 norm!//e^Mv??^M"Ay
\d\+
。 Ex命令以norm!
命令开始,执行Normal
模式命令//e^Mv??^M"Ay
。这是由
回车符^M
。第一个 //e
查找搜索
模式(设置为全局命令中使用的模式)并将
光标指向匹配的最后一个符号(由于标志 e
,请参阅 :help
搜索偏移量
)。然后v
命令启动可视模式。命令 ??
看起来
对于最后一个搜索模式向后(并将光标放在第一个
匹配的字符),从而选择与上次搜索匹配的文本
图案。最后一个命令,"Ay
,将选定的文本拉出并将其附加到
a
注册。
2 第二个全局命令类似于第一个全局命令。 在每个匹配行,它将光标移动到匹配的最后一个符号 并在该符号后插入换行符。然后它将光标置于开头 匹配并选择(在可视模式下)直到行尾的所有内容 (包括刚刚插入的换行符)。最后,该命令附加所选的 文本到寄存器,并撤消换行符插入。
3 人们总是可以通过以下方式查看特定宏中记录的操作:
使用 :di z
或 "zp
检查相应寄存器的内容,
例如。
关于vim - 如何在 Vim 中将所有 hlsearch 文本复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6176659/