如何在Vim中使用惰性量词提取Nmap扫描报告中的域名?
在Vim中提取Nmap扫描报告里的域名的多种实现方法
嘿,我整理了几种在Vim里提取目标域名的实用方案,完美适配你的需求:
方法1:全局命令+替换,直接提取到文件末尾
如果你想把所有域名提取并归集到当前文件末尾,可以执行这条命令:
:g/^Nmap scan report for /s/^Nmap scan report for \(\S\+\) .*/\1/ | normal! ddGp
解释:
:g/^Nmap scan report for /:匹配所有以指定内容开头的行s/^Nmap scan report for \(\S\+\) .*/\1/:把行内容替换成第一个捕获组(\S\+匹配非空白字符,正好对应域名)normal! ddGp:执行普通模式操作,删除当前行(dd)、跳到文件末尾(G)、粘贴该行(p)
方法2:用Vim专属零宽定位符简化提取
Vim里的\zs和\ze是替代lookaround的常用工具,能精准标记匹配内容的起止位置:
2.1 复制所有域名到寄存器
执行以下命令,把所有域名批量复制到寄存器a:
:let @a = '' | g/^Nmap scan report for /normal! /report for \zs\S\+<CR>yiW
解释:
/report for \zs\S\+<CR>:搜索到域名的起始位置(*\zs*标记匹配开始的地方)yiW:复制光标下的整个非空白单词(正好是域名)
之后你可以用"ap把寄存器里的域名粘贴到任意位置。
2.2 开启very magic模式贴近Perl正则语法
开启\v标记的very magic模式后,正则写法更接近你熟悉的Perl风格,无需额外转义:
:g/\v(report for )@<=(\S+) /s//\1/
解释:
\v:启用very magic模式(report for )@<=:对应你熟悉的(?<=report for )正向回顾断言(\S+):捕获域名内容
方法3:批量提取并导出到新文件
如果想直接把域名保存到独立文件,执行:
:%s/^Nmap scan report for \(\S\+\) .*/\1/g | w! domains.txt
解释:
:%s/.../.../g:对所有行执行替换,只保留域名w! domains.txt:把处理后的内容保存到新文件domains.txt,原文件不会被修改
方法4:可视模式下提取部分行的域名
如果你只想提取选中行的域名:
- 进入可视行模式(按
V),选中目标行 - 执行替换命令:
:'<,'>s/^Nmap scan report for \(\S\+\) .*/\1/
这样只会修改选中的行,精准提取目标域名。
内容的提问来源于stack exchange,提问作者KarlsD
相关产品推荐
相关产品推荐

