1

我有一个看起来像这样的文本文件:

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 提取 : 和 @ 分隔符之间的单词,输出应该是:

At4g00020  At5g20850
At4g00020  At3g22880

我做了:

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

没有成功提前感谢您的帮助

汤姆。

4

3 回答 3

3

您的正则表达式存在一些问题。

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

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

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

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

perl -lne '@result = /:(At[^@]*)/g; print join("\t", @result)'
于 2012-09-12T10:54:45.783 回答
2

尝试这样的事情:

perl -l -ne '/:(?=At)([^@]*)/ and print($1,"\t",$2)'
于 2012-09-12T10:50:33.713 回答
1

这对我有用:

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

搜索:,后面跟着一个不带分隔符的字符串,将其@关闭。

于 2012-09-12T10:50:27.410 回答