2016-02-26 141 views
0

我试图使用grep从文件中选择特定的核苷酸序列。顺序应该是AC,然后是1个或多个A+不适用于grep

如果我尝试使用以下命令:

grep 'ACA*' nucleotides.txt 

它的工作原理,但是这其实不是我想要的。我真的需要C后有至少一个A,因此应该正确的正则表达式应该是

grep 'ACA+' nucleotides.txt 

,但它不匹配任何东西,即使该文件明确包含这些模式。

grep 'ACA+' nucleotides.txt有什么不对?

+0

反向重复的http://stackoverflow.com/q/188787/2564301 - 仍然,你应该阅读。 – usr2564301

回答

3

grep的区别。在基本正则表达式中,某些字符(其中+)具有它们的字面含义。逃离它们以获得其特殊含义的可能性是GNU grep的扩展(正如Benjamin W.所提到的)。

grep 'ACA\+' 

另一种方法是使用egrep(根据GNU grep的手册页不建议使用),或grep -E,这样你可以使用扩展的正则表达式,其中+有你所期望的含义:

grep -E 'ACA+' 

您可以在grep手册页找到所有这些(包括适用的字符列表)。

那么,哪种方法更好?如上所述,在基本正则表达式中对\+的支持可能不适用于某些grep实现。如果您的目标是在POSIX兼容系统上实现便携性,则最好使用grep -E

+0

为什么'egrep'已弃用? – nbro

+1

GNU grep支持BRE中的'\ +'作为扩展名; [POSIX BRE](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03)没有'+'作为元字符。 –

+0

@BenjaminW .:谢谢你的提示 - 我没有意识到这一点。 –

2

你需要逃避它:基本和扩展正则表达式之间

grep 'ACA\+' nucleotides.txt 
+0

哦,谢谢!我如何知道哪些字符需要转义? – nbro

+1

我也注意到,如果我使用选项'-E'(用于扩展),我不需要转义'+'... – nbro

+0

@nbro - 谷歌基本的,扩展的和Perl兼容的正则表达式(BREs ,EREs和PCREs),并了解哪些工具支持哪些选项(默认情况下,sed = BREs可以扩展为EREs; awk = EREs或Strings;缺省情况下,grep = BREs可以扩展为EREs或Strings和一些版本到PCRE)。 –

相关问题