リテラル「..」をgrepする方法

リテラル「..」をgrepする方法

私はgrepを使ってファイルを解析していますが、画面の出力には次の改行文字が含まれています。

$ grep 'gene' sequence.gb
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

変数に割り当て、改行を使用して印刷できます。

$ gene=$(grep 'gene' sequence.gb)
echo "$gene"
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

ただし、これには実際の改行文字は含まれません。 '..'を含む行を再検索すると、すべて取得できるためです。

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

これは、引用符のない単一の文字列であることがわかります。

$ echo $gene
gene 89..1483 /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" /gene="non-structural protein" gene complement(1987..2763) /gene="nucleocapsid protein" /gene="nucleocapsid protein"

私の質問は、改行形式をどのように維持または導入できるかということです。

ありがとう

ベストアンサー1

.これは正規表現のワイルドカードなので、2grep '..'つ以上の文字を含むすべての行と一致します。

$ echo "$gene" | grep '..'
     gene            89..1483
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
                     /gene="non-structural protein"
     gene            complement(1987..2763)
                     /gene="nucleocapsid protein"
                     /gene="nucleocapsid protein"

正規表現では.本当に言えないことです。文字や数字だけでなく、句読点、スペース、タブ、その他すべての文字と一致します。

ピリオドのみを一致させるには、以下を使用します-F

$ echo "$gene" | grep -F '..'
     gene            89..1483
     gene            complement(1987..2763)

-Fパターンを正規表現ではなく固定文字列として扱うように--fixed-strings指示する略語です。grep

または、ピリオドだけが一致するようにピリオドをエスケープできます(ヒント:ギャップ):

$ echo "$gene" | grep '\.\.'
     gene            89..1483
     gene            complement(1987..2763)

grepまたは、ピリオドを文字クラスに入れて、ピリオドを文字通りのピリオドとして扱うように強制することもできます(ヒント:デイブ・トンプソン):

$ echo "$gene" | grep '[.][.]'
     gene            89..1483
     gene            complement(1987..2763)

ただし、正規表現が必要ない場合は、正規表現を使用するとプロセスが速くなります-Fgrep

おすすめ記事