web-dev-qa-db-ja.com

「|」を使用した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を使用してこれから特定の行を抽出するのに問題があります。 3番目の列に指定されているタイプ「gene」またはタイプ「exon」の行をすべて抽出したかった。これがうまくいかなかったとき私は驚いた:

grep 'gene|exon' AT5G60410.gff

結果は返されません。どこがおかしいの?

78
MattLBeck

|をエスケープする必要があります。次の作業を行う必要があります。

grep "gene\|exon" AT5G60410.gff
119
Jeff Foster

デフォルトでは、grepはエスケープされない限り、通常の特殊文字を通常の文字として扱います。したがって、次を使用できます。

grep 'gene\|exon' AT5G60410.gff

ただし、次のフォームを使用して、期待どおりにモードを変更できます。

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
44
a'r

これは、いくつかの選択肢に対するgrepの異なる方法です。

grep -e gene -e exon AT5G60410.gff

-eスイッチは、一致するさまざまなパターンを指定します。

25
Nathan Fellman

これは動作します:

grep "gene\|exon" AT5G60410.gff
1
ennuikiller

正規表現で代替演算子を使用したgrepコマンドに piped command を使用していた特定の問題をグーグル検索しているときにこの質問を見つけたので、より専門的な回答。

私が直面したエラーは、grep regexの代替演算子(つまり、パイプ演算子と同じ|)ではなく、前のパイプ演算子(つまり、|)にあることが判明しました。私にとっての答えは、必要に応じて適切にエスケープして引用することでした &などの特殊なシェル文字 は、代替演算子を含むgrep正規表現に問題があると想定する前に。

たとえば、ローカルマシンで実行したコマンドは次のとおりです。

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

このコマンドにより、次のエラーが発生しました。

-bash: syntax error near unexpected token `|'

このエラーは、コマンドを次のように変更することで修正されました。

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

&文字を二重引用符でエスケープすることで、問題を解決できました。答えは交替操作とはまったく関係ありませんでした。

0
entpnerd