我想使用Vim匹配正则表达式并执行替换。我有一个tsv文件,其行如下所示:
rs11223-A -A
rs23300-G -TTA
rs9733-T -G
rs11900000-GT -TTG
我希望仅在rs ...
之后的第一列中用短划线( - )替换选项卡在Vim中,我尝试使用以下方式执行替换:
:%s/(?<=^rs[0-9]{1,12})-/\t/g
有谁可以指出我的问题是什么,并找到正确的解决方案?
答案 0 :(得分:21)
它可能依赖于配置,但在我的环境中,我必须在{ , }
之前添加\
。
此外,Vim有\zs
和\ze
来开始和结束匹配,因此您通常不需要处理正常的正则表达式外观。
这样做你想要的:
:%s/^rs\d\{1,12}\zs-/\t/g
答案 1 :(得分:8)
使用以下方式完成正面观察:
\@<=
所以你可以使用类似的东西:
:%s/\d\@<=-/\t/g
您的实际数据可能会更复杂,但是根据您发布的内容,您也可以满足于:
:%s/-/\t
如果rs
位于该行的开头,您可以使用\zs
指定匹配的开头并使用锚定(^
):
:%s/^rs\d*\zs-/\t
答案 2 :(得分:0)
您需要以下内容:
%s/^\(rs[0-9]\{1,12\}\)-/\1\t/g
Vim正则表达式需要{
,}
,(
和)
的一些特殊转义序列。
此外,在替换部分,您需要\1
来插入匹配的字符串。
答案 3 :(得分:0)
使用lookbehind的正确表达式是:
%s/\(\d\+\)\@<=-/\t/gc
\(\d\+\)\@<=
表示正向后寻找数字(\d\+
表示至少寻找一个数字)。根据{{3}},我们必须先捕捉\d\+
,然后再应用正面的外观,因此\(\)
周围的\d\+
。
另外,要使用普通的正则表达式+
量词,我们必须在vim(\+
)中对其进行转义,请参见here。