「|」を使用したgrepping 代替オペレーター


92

以下は、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

結果は返されません。どこが間違っているのですか?


8
egrep代わりに試してください。
キース

egrepはPerlが使用する種類の正規表現に近いですか?(これは私が以前に使用したものです)
MattLBeck '21 / 07/21

回答:


136

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

grep "gene\|exon" AT5G60410.gff

ああ、ちょうど私がgrepで使用するための間違った正規表現チュートリアルに従っていることに気づきました。どこにも良いgrepが見つからないようです。これをありがとう!
MattLBeck 2011

49

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

grep 'gene\|exon' AT5G60410.gff

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

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

27

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

grep -e gene -e exon AT5G60410.gff

-eスイッチが一致する異なるパターンを指定します。


今問題は何がより速いですか?誰か知ってる?
Stalinko 2014

1
@stalinko:timeコマンドを使用して調べることができるはずです。
Nathan Fellman、2014年

2

これは動作します:

grep "gene\|exon" AT5G60410.gff

2
この回答には、このstackoverflow.com/a/6775943/3933332にないはどれですか?
Rizier123 2015年

3
@ Rizier123-タイムスタンプを見てください。どちらもほぼ同じ時間に同じ回答で回答されています。
xmnboy 2016

うん、1分遅れる。それでも、投票された回答と同じ回答を削除します。特に私のベルトの下で40kの評判があった場合。
Attila Csipak

0

正規表現で選択演算子を使用するコマンドにパイプコマンドを含めていた特定の問題をグーグル検索しているときにこの質問を見つけたgrepので、より専門的な回答を提供すると思いました。

私が直面したエラーは、以前のパイプオペレーター(つまり、 ||は、grep regex の代替演算子(つまり、パイプ演算子と同一)ではなく、)。私の答えは、問題がオルタネーション演算子に関係する私のgrep正規表現にあると想定する前に、&​​などの必要な特殊シェル文字として適切にエスケープして引用することでした。

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

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

このコマンドの結果、次のエラーが発生しました:

-bash: syntax error near unexpected token `|'

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.