grepping с помощью "|"альтернативный оператор - PullRequest
78 голосов
/ 21 июля 2011

Ниже приведен пример большого файла с именем 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

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

Ответы [ 5 ]

118 голосов
/ 21 июля 2011

Вам нужно сбежать от |.Следующее должно сделать работу.

grep "gene\|exon" AT5G60410.gff
44 голосов
/ 21 июля 2011

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

grep 'gene\|exon' AT5G60410.gff

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

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
25 голосов
/ 21 июля 2011

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

grep -e gene -e exon AT5G60410.gff

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

1 голос
/ 21 июля 2011

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

grep "gene\|exon" AT5G60410.gff
0 голосов
/ 08 февраля 2017

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

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

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

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

Эта команда вызвала следующую ошибку:

-bash: syntax error near unexpected token `|'

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...