如何仅在vim中的模式搜索中导出匹配项?

时间:2010-06-13 09:44:00

标签: regex vim substitution

有没有办法只在模式搜索中抓取并导出匹配部分而不更改当前文件?

例如,来自包含以下内容的文件

57","0","37","","http://www.thisamericanlife.org/Radio_Episode.aspx?episode=175"
58","0","37","","http://www.thisamericanlife.org/Radio_Episode.aspx?episode=170"

我想导出一个包含以下内容的新文件:

http://www.thisamericanlife.org/Radio_Episode.aspx?episode=175
http://www.thisamericanlife.org/Radio_Episode.aspx?episode=170

我可以通过使用这样的替换来做到这一点:

:s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
:%w>>data

但替换命令会更改当前文件。有没有办法在不更改当前文件的情况下执行此操作?

更新

我正在寻找这样的命令:

:g/pattern/.w>>newfile

此命令写入匹配发生的整行。我想只导出匹配,而不是整行。

3 个答案:

答案 0 :(得分:2)

redir >>newfile
g/^/let g:match=matchstr(getline(line('.')), pattern) | if g:match!=#"" | silent echo g:match | endif
redir END

说明:

redir >> newfile
开始将邮件重定向到文件newfile,如果存在则附加。
g/^/
每行
getline(line('.'))
获取行内容
let g:match(getline(line('.')), pattern)
找到与pattern匹配的行的一部分,并将其保存在g:match变量
if g:match!=#""
如果行匹配模式
echo g:match
输出匹配的行
silent echo g:match
但仅限于redir命令指定的位置。
redir END
停止重定向输出。

答案 1 :(得分:2)

只需更改您的订单:

 :w newfile.txt
 :e newfile.txt
 :%s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
 :w

答案 2 :(得分:0)

你是说这个吗?

:e currfile.txt
:s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
:w newfile.txt

或者您想继续编辑上一个文件吗?

编辑:或者您可以撤消(按'u')。