Regex 如何提取已经匹配多行模式的文本?

Regex 如何提取已经匹配多行模式的文本?,regex,vim,awk,Regex,Vim,Awk,全部 使用vim元字符\ \。或者awk,我已经匹配了多行,但我不知道如何将它们拉入或提取到其他文件中。有没有一种通用的方法来做到这一点 这个答案适用于Vim,而不是Awk 我可以建议: function CopyPatternToRegisterZ(pat) let @z .= a:pat return a:pat endfunction 然后: :let @z = '' :%s/your_pattern/\= CopyPatternToRegisterZ(submatch(0))

全部
使用vim元字符\ \。或者awk,我已经匹配了多行,但我不知道如何将它们拉入或提取到其他文件中。有没有一种通用的方法来做到这一点

这个答案适用于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

在awk中使用print,然后将输出重定向到其他文件

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

仅将模式复制到另一个文件

"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/#

如果您在搜索开始时,
y//e
将把整个匹配的字符串复制到默认寄存器中。请注意,在此操作之后,
n
将使您进入当前搜索的结束(因为
e
偏移标志已保存),如果希望
n
继续启动,则应另外键入
/
(这将清除所有偏移标志)。因此,整个键序列是

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

不需要使用
CopyPatternToRegisterZ()
。请改用
setreg('Z',子匹配(0))
。如果要按行执行此操作,请使用
setreg('Z',子匹配(0),'l'))
@Peter Rincker:
setreg
是否返回寄存器的值?如果不返回,则替换可能会导致一些问题。成功时返回零,失败时返回非零。我现在明白了为什么要创建自己的函数。尽管运行替换后只需执行一个简单的
u
即可实现效果。但这并不能回答问题n、 这些命令复制行,而不是多行模式!可能是显式的并使用
//s
不会有什么坏处。因此,为了完成回答,可以将其记录到宏中。