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

以下是名为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提取特定的行。 我想提取所有types为“gene”或types“exon”的行,在第三列中指定。 当这不起作用时,我感到惊讶:

 grep 'gene|exon' AT5G60410.gff 

没有结果返回。 我哪里错了?

你需要逃避| 。 以下应该做的工作。

 grep "gene\|exon" AT5G60410.gff 

默认情况下,grep将典型的特殊字符视为普通字符,除非它们被转义。 所以你可以使用以下内容:

 grep 'gene\|exon' AT5G60410.gff 

但是,您可以通过使用以下表单来执行您所期望的操作来更改其模式:

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

这是一个不同的select方式:

 grep -e gene -e exon AT5G60410.gff 

-e开关指定要匹配的不同模式。

这将工作:

 grep "gene\|exon" AT5G60410.gff 

我发现这个问题,同时search一个特定的问题,我曾经涉及到一个grep命令的pipe道命令 ,在正则expression式中使用了交替操作符,所以我认为我会提供我更专业的答案。

我所面对的错误原来是在grep正则expression式中与之前的pipe道操作符(即| )而不是交替操作符(即与pipe道操作符相同)。 对我来说,答案就是要妥善地转义和引用必要的特殊shell字符,比如在假设问题出现在我的grep正则expression式中,涉及到交替操作符。

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

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

此命令导致以下错误:

 -bash: syntax error near unexpected token `|' 

通过将我的命令更改为:

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

通过用双引号转义&字符,我能够解决我的问题。 答案根本与交替操作无关。