使用“|”进行grepping替代运营商

时间:2011-07-21 12:18:31

标签: regex linux grep

以下是名为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

未返回任何结果。我哪里出错?

5 个答案:

答案 0 :(得分:114)

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

grep "gene\|exon" AT5G60410.gff

答案 1 :(得分:43)

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

grep 'gene\|exon' AT5G60410.gff

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

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

答案 2 :(得分:24)

这是一种不同的选择方式:

grep -e gene -e exon AT5G60410.gff

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

答案 3 :(得分:1)

这将有效:

grep "gene\|exon" AT5G60410.gff

答案 4 :(得分:0)

我在搜索特定问题时发现了这个问题我涉及piped command Key-Value命令在正则表达式中使用了交替运算符,所以我认为我会贡献更专业的答案。

我遇到的错误原来是前一个管道运算符(即grep),而不是grep正则表达式中的交替运算符(即|与管道运算符相同)。对我来说,答案就是在假设问题出现在我的grep正则表达式中并且涉及交替运算符时,正确地逃避并引用必要special shell characters such as &

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

|

此命令导致以下错误:

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

将我的命令更改为:

,更正了此错误
-bash: syntax error near unexpected token `|'

通过双引号转义get "http://localhost/foobar-&" | grep "fizz\|buzz" 字符,我能够解决我的问题。答案完全与交替操作无关。