以下是名为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
未返回任何结果。我哪里出错?
答案 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"
字符,我能够解决我的问题。答案完全与交替操作无关。