2011-03-10 53 views

回答

3

這個答案適用於Vim,而不是Awk。

我可以建議:

function CopyPatternToRegisterZ(pat) 
    let @z .= a:pat 
    return a:pat 
endfunction 

然後:

:let @z = '' 
:%s/your_pattern/\= CopyPatternToRegisterZ(submatch(0)) /g 

然後你可以用"zp你的比賽粘貼到另一個文件。

有關此語法的詳細信息,請參閱:help sub-replace-expression

+0

不需要'CopyPatternToRegisterZ()'。改用'setr​​eg('Z',submatch(0))'。如果你想這樣做linewise然後'setr​​eg('Z',submatch(0),'l')' – 2011-03-10 15:30:01

+0

@Peter Rincker:'setr​​eg'返回寄存器的值嗎?如果不是更換會導致一些問題。 – Benoit 2011-03-10 15:45:17

+0

成功時返回零,失敗時返回非零。我現在看到爲什麼你創建了自己的功能。儘管運行替換後一個簡單的'u'就可以達到這個效果。 – 2011-03-10 15:53:08

1

在awk中使用print然後將輸出重定向到其他文件。

awk 'BEGIN {FS =" "}; { if ($0 ~ /(expression)/) { print $0 } }' inputfile.txt > outputfile.txt 
0

只有到模式複製到另一個文件

"between marks 
:'a,'b g/^Error/ . w >> errors.txt 

"entire file 
:% g/pattern/ . w >> log.txt 

"to display "whit numbers", lines containing the desired pattern 
:g/pattern/# 
+0

這不回答這個問題。這些命令複製行,而不是多行模式! – Benoit 2011-03-11 06:33:27

0

如果你在搜索的開始,y//e<CR>將複製整個匹配的字符串到默認的寄存器。請注意,在此動作n將帶您到當前搜索結束(因爲e偏移標誌被保存),如果您想要n繼續使您開始,您應該另外鍵入//<CR>(清除所有偏移標誌)。因此,整個密鑰序列是

/<pattern><CR>y//e<CR>//<CR>N 
+0

也許是明確的,使用'// s'不會傷害。所以要完成你的答案,這可以記錄到一個宏。 – Benoit 2011-03-11 15:50:01