Подтвердить что ты не робот

Grepping используя "|" альтернативный оператор

Ниже приведен пример большого файла с именем 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. Я хотел извлечь все строки, которые имеют тип "ген", или тип "экзон", указанный в третьем столбце. Я был удивлен, когда это не сработало:

grep 'gene|exon' AT5G60410.gff

Результаты не возвращаются. Где я ошибся?

4b9b3361

Ответ 1

Вам нужно избежать |. Следующее должно выполнить эту работу.

grep "gene\|exon" AT5G60410.gff

Ответ 2

По умолчанию grep обрабатывает типичные специальные символы как обычные символы, если они не экранированы. Поэтому вы можете использовать следующее:

grep 'gene\|exon' AT5G60410.gff

Однако вы можете изменить его режим, используя следующие формы, чтобы выполнить то, что вы ожидаете:

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

Ответ 3

Это другой способ grepping для нескольких вариантов:

grep -e gene -e exon AT5G60410.gff

Переключатель -e указывает разные шаблоны для соответствия.

Ответ 4

Это будет работать:

grep "gene\|exon" AT5G60410.gff

Ответ 5

Я нашел этот вопрос во время поиска по конкретной проблеме, с которой я связал команду с помощью команды <, которая использовала чередование оператор в регулярном выражении, поэтому я подумал, что сделаю свой более специализированный ответ.

Ошибка, с которой я столкнулся, оказалась с предыдущим оператором трубы (т.е. |), а не с параметром чередования (т.е. |, идентичным оператору трубы) в общем выражении grep. Ответ для меня состоял в том, чтобы правильно сбежать и указать при необходимости специальные символы оболочки, такие как &, прежде чем предполагать, что проблема связана с моим средним регулярным выражением grep оператор чередования.

Например, команда, которую я выполнил на моей локальной машине, была:

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

Эта команда привела к следующей ошибке:

-bash: syntax error near unexpected token `|'

Эта ошибка была исправлена ​​путем изменения моей команды на:

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

Удерживая символ & с двойными кавычками, я смог решить проблему. Ответ не имел ничего общего с операцией чередования.