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
不会有什么坏处。因此,为了完成回答,可以将其记录到宏中。