2010-06-13 61 views
1

有沒有辦法只在模式搜索中抓取和導出匹配部分而不更改當前文件?如何僅在vim中的模式搜索中導出匹配項?

例如,從包含文件:

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 

此命令寫到哪匹配時整條生產線。我只想輸出比賽,而不是整條線。

回答

2

只要改變你的訂單:

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

你的意思是?

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

或者您想繼續編輯上一個文件嗎?

編輯:或者你可以簡單地撤消(按'u')。

+0

是的,這是類似我做什麼。我可以撤消,但我不知道是否有辦法做到這一點,而不改變當前文件,如:g/pattern/.w >> newfile – 2010-06-13 10:46:39

+0

啊。我現在得到你想要的東西,但我不知道該怎麼做... – Umang 2010-06-13 12:45:26

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
停止重定向輸出。
+0

哇,這很好,但有點困難。感謝您的詳細說明。 – 2010-06-13 13:42:10

相關問題