grep usando o “|” operador alternativo


92

A seguir está um exemplo de um arquivo grande denominado 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

Estou tendo problemas para extrair linhas específicas usando grep. Eu queria extrair todas as linhas que são do tipo "gene" ou tipo "exon", especificadas na terceira coluna. Fiquei surpreso quando isso não funcionou:

grep 'gene|exon' AT5G60410.gff

Nenhum resultado é retornado. Onde eu errei?


8
Em egrepvez disso, tente .
Keith

é egrep mais próximo do tipo de regex que o Perl usa? (este é o que eu usei antes)
MattLBeck

Respostas:


136

Você precisa escapar do |. O seguinte deve fazer o trabalho.

grep "gene\|exon" AT5G60410.gff

argh, acabei de perceber que estava seguindo o tutorial de regex errado para usar em grep. Não consigo encontrar um bom grep em qualquer lugar. Obrigado por isso!
MattLBeck

49

Por padrão, grep trata os caracteres especiais típicos como caracteres normais, a menos que sejam escapados. Então, você pode usar o seguinte:

grep 'gene\|exon' AT5G60410.gff

No entanto, você pode alterar seu modo usando os seguintes formulários para fazer o que espera:

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

27

Esta é uma maneira diferente de usar o grep para algumas opções:

grep -e gene -e exon AT5G60410.gff

a -eopção especifica diferentes padrões para combinar.


agora a questão é o que é mais rápido? alguém sabe?
Stalinko

1
@stalinko: você deve ser capaz de usar o timecomando para descobrir.
Nathan Fellman

2

Isso vai funcionar:

grep "gene\|exon" AT5G60410.gff

2
Qual valor tem esta resposta que stackoverflow.com/a/6775943/3933332 não tem?
Rizier123,

3
@ Rizier123 - veja os carimbos de data / hora, ambos responderam em momentos quase idênticos com a mesma resposta.
xmnboy

Sim, apenas um minuto atrasado. Ainda assim, eu excluiria uma resposta idêntica à resposta votada. Especialmente se tivesse uma reputação de 40 mil no meu currículo.
Attila Csipak

0

Eu encontrei esta pergunta enquanto pesquisava no Google por um problema específico que estava tendo envolvendo um comando canalizado para umgrep comando que usava o operador de alternância em uma regex, então pensei que poderia contribuir com minha resposta mais especializada.

O erro que enfrentei acabou sendo com o operador de pipe anterior (ou seja, |) e não com o operador de alternação (ou seja, |idêntico ao operador de pipe) no grep regex. A resposta para mim foi escapar e citar adequadamente como caracteres de shell especiais necessários , como &, antes de assumir que o problema era com meu regex grep que envolvia o operador de alternância.

Por exemplo, o comando que executei em minha máquina local foi:

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

Este comando resultou no seguinte erro:

-bash: syntax error near unexpected token `|'

Este erro foi corrigido alterando meu comando para:

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

Ao escapar do &caractere com aspas duplas, consegui resolver meu problema. A resposta não teve nada a ver com a operação de alternância.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.