积极的后卫断言和Vim的替代?

drb*_*sen 12 regex vim

我想使用Vim匹配正则表达式并执行替换.我有一个tsv文件,其行如下所示:

rs11223-A        -A
rs23300-G        -TTA
rs9733-T          -G
rs11900000-GT    -TTG
Run Code Online (Sandbox Code Playgroud)

我希望仅在rs之后的第一列中用短划线( - )字符替换选项卡...

在Vim中,我尝试使用以下方法执行替换:

:%s/(?<=^rs[0-9]{1,12})-/\t/g   
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我的问题是什么和正确的解决方案?

Jay*_*Jay 21

它可能取决于配置,但在我的环境中,我必须先{ , }添加\.

此外,Vim有\zs\ze开始和结束匹配,因此你通常不必应付正常的正则表达式环视.

这样做你想要的:

:%s/^rs\d\{1,12}\zs-/\t/g
Run Code Online (Sandbox Code Playgroud)


Pet*_*den 8

正面看后面是使用:

\@<=
Run Code Online (Sandbox Code Playgroud)

所以你可以使用类似的东西:

:%s/\d\@<=-/\t/g
Run Code Online (Sandbox Code Playgroud)

您的实际数据可能更复杂,但是您发布的内容也可以满足:

:%s/-/\t
Run Code Online (Sandbox Code Playgroud)

如果rs应该在行的开头,您可以使用\zs指定匹配的开始并使用anchoring(^):

:%s/^rs\d*\zs-/\t
Run Code Online (Sandbox Code Playgroud)