使用“ |”进行grepping 替代运算符


92

以下是一个名为AT5G60410.gff的大文件的示例:

Chr5    TAIR10  gene    24294890    24301147    .   +   .   ID=AT5G60410;Note=protein_coding_gene;Name=AT5G60410
Chr5    TAIR10  mRNA    24294890    24301147    .   +   .   ID=AT5G60410.1;Parent=AT5G60410;Name=AT5G60410.1;Index=1
Chr5    TAIR10  protein 24295226    24300671    .   +   .   ID=AT5G60410.1-Protein;Name=AT5G60410.1;Derives_from=AT5G60410.1
Chr5    TAIR10  exon    24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  exon    24295134    24295249    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24295134    24295225    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  CDS 24295226    24295249    .   +   0   Parent=AT5G60410.1,AT5G60410.1-Protein;
Chr5    TAIR10  exon    24295518    24295598    .   +   .   Parent=AT5G60410.1

我在使用grep从中提取特定行时遇到了一些麻烦。我想提取第三列中指定的所有类型为“ gene”或“ exon”的行。当这不起作用时,我感到很惊讶:

grep 'gene|exon' AT5G60410.gff

没有结果返回。我哪里出问题了?


8
试试吧egrep
基思

egrep是否更接近Perl使用的正则表达式?(这是我以前使用过的)
MattLBeck

Answers:


136

您需要逃脱|。以下应该做的工作。

grep "gene\|exon" AT5G60410.gff

argh,刚意识到我在grep中使用了错误的regex教程。我似乎在任何地方都找不到好的grep。谢谢你!
MattLBeck

49

默认情况下,除非将特殊特殊字符转义,否则它们会将典型特殊字符视为普通字符。因此,您可以使用以下内容:

grep 'gene\|exon' AT5G60410.gff

但是,您可以使用以下形式来更改其模式,以达到预期效果:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff



0

我在搜寻涉及到通过正则表达式中使用交替运算符的命令的管道命令时遇到的一个特定问题,因此发现了这个问题grep,因此我想我会提供更专业的答案。

我遇到的错误竟然是grep regex中的上一个管道运算符(即|),而不是根本不是交替运算符(即|与管道运算符相同)的。对我来说,答案是正确地转义并引用必要的特殊shell字符(例如&),然后假定问题出在我的grep regex涉及替换运算符的问题上。

例如,我在本地计算机上执行的命令是:

get http://localhost/foobar-& | grep "fizz\|buzz"

此命令导致以下错误:

-bash: syntax error near unexpected token `|'

通过将命令更改为可以更正此错误:

get "http://localhost/foobar-&" | grep "fizz\|buzz"

通过&用双引号转义字符,我可以解决我的问题。答案与轮换操作完全无关。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.