2011-03-10 54 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