Ответ 1
Вам нужно избежать |
. Следующее должно выполнить эту работу.
grep "gene\|exon" AT5G60410.gff
Ниже приведен пример большого файла с именем 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
Результаты не возвращаются. Где я ошибся?
Вам нужно избежать |
. Следующее должно выполнить эту работу.
grep "gene\|exon" AT5G60410.gff
По умолчанию grep обрабатывает типичные специальные символы как обычные символы, если они не экранированы. Поэтому вы можете использовать следующее:
grep 'gene\|exon' AT5G60410.gff
Однако вы можете изменить его режим, используя следующие формы, чтобы выполнить то, что вы ожидаете:
egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
Это другой способ grepping для нескольких вариантов:
grep -e gene -e exon AT5G60410.gff
Переключатель -e
указывает разные шаблоны для соответствия.
Это будет работать:
grep "gene\|exon" AT5G60410.gff
Я нашел этот вопрос во время поиска по конкретной проблеме, с которой я связал команду с помощью команды <, которая использовала чередование оператор в регулярном выражении, поэтому я подумал, что сделаю свой более специализированный ответ.
Ошибка, с которой я столкнулся, оказалась с предыдущим оператором трубы (т.е. |
), а не с параметром чередования (т.е. |
, идентичным оператору трубы) в общем выражении grep. Ответ для меня состоял в том, чтобы правильно сбежать и указать при необходимости специальные символы оболочки, такие как &, прежде чем предполагать, что проблема связана с моим средним регулярным выражением grep оператор чередования.
Например, команда, которую я выполнил на моей локальной машине, была:
get http://localhost/foobar-& | grep "fizz\|buzz"
Эта команда привела к следующей ошибке:
-bash: syntax error near unexpected token `|'
Эта ошибка была исправлена путем изменения моей команды на:
get "http://localhost/foobar-&" | grep "fizz\|buzz"
Удерживая символ &
с двойными кавычками, я смог решить проблему. Ответ не имел ничего общего с операцией чередования.