perl regex - 提取2个分隔符之间的单词

时间:2012-09-12 10:43:52

标签: regex perl unix

我有一个文本文件,如下所示:

entrez*gene/locuslink:"BRCA2(IV)"|entrez*gene/locuslink:At4g00020@entrez*gene/locuslink:RAD51|entrez*gene /locuslink:At5g20850@
entrez*gene/locuslink:"BRCA2(IV)"|entrez*gene/locuslink:At4g00020@entrez*gene/locuslink:DMC1|entrez*gene/locuslink:At3g22880@

我希望在unix中使用perl提取:和@ separators之间的单词 输出应该是:

At4g00020  At5g20850
At4g00020  At3g22880

我做了:

perl -l -ne '/:["At"]([^@]*)/ and print($1,"\t",$2)

没有成功 在此先感谢您的帮助

汤姆。

3 个答案:

答案 0 :(得分:3)

你的正则表达式有一些问题。

首先,[...]表示与括号内的一个字符匹配的字符类。这意味着["At"]将匹配其中一个字符''','A'或't'。省略括号和双引号..

其次,您想要收集多个匹配项。这可以通过在列表上下文中使用/ g修饰符来完成:

perl -lne '@result = /:At([^@]*)/g; print join("\t", @result)'

最后,根据预期的输出,您还需要捕获At:

perl -lne '@result = /:(At[^@]*)/g; print join("\t", @result)'

答案 1 :(得分:2)

尝试这样的事情:

perl -l -ne '/:(?=At)([^@]*)/ and print($1,"\t",$2)'

答案 2 :(得分:1)

这对我有用:

perl -l -ne '/:([^:@]*)@.*:([^:@]*)@/ and print($1,"\t",$2)'

搜索:,不带分隔符的字符串,@将其关闭。