togatttiのエンジニアメモ

過度な期待はしないでください.

grep -Fで固定文字列を検索する

コマンドライン上で正規表現文字が含まれた文字列をgrepするときにはまったので、メモとして書いておく。

前提

ここでいう正規表現文字とは&, (, ), |, -,^, ?, *, [, ], $, `, {, }などの正規表現時に使う特殊な意味を 持つ文字のことを指す。

選択肢

通常、コマンドライン上で正規表現文字を無効化してgrepの対象にする場合、

  1. 「\」でエスケープする

  2. シングルクォート(')で囲む

などの選択肢がある。

ただエスケープで処理する場合、正規表現文字と解釈される文字が複数含まれる場合には、 バックスラッシュだらけになり、見栄えが崩れ、可読性が阻害されることがある。

また、シングルクォートを使う場合は、「'」を検索するときに、待機状態となり正しく機能しない。 「'」で囲むとエスケープ文字も無効になる。

$ cat test.pl
my $val='hoge';
$ cat test.pl | grep '''
>
$ cat test.pl | grep '\''
>

なので、1、2で思うような結果にならないときはgrepの-Fオプションを使うと

うまくいくかもしれない。

grep -Fとは

       -F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by newlines, any  of  which  is  to  be
              matched.

パターンではなく固定文字列での検索を行う。

つまり、正規表現で意味を持つ文字をエスケープせずに検索できる。

例えばこんな感じで使う。

$ cat hoge.pl
my $mail_address_pattern=/^(.+)@(.+)$/;
$ cat hoge.pl | grep -Fo "^(.+)@(.+)"
^(.+)@(.+)

メリットはエスケープを気にせずにgrepできる。

正規表現文字を含む文字列をgrepするときは、-Fオプションを使おう。

注意点

grep -Fを使う際に、キーワードに「"」「$」を含む場合にはエスケープする必要がある。

引用符(',")は対にしておかないと、処理が待機状態のままで終了しないため。 「$」の場合は詳細がよく分からないので、後で追記します。

正規表現とかシェルでは変数の参照などでも使うので複雑なのかな...

ここ見れば、何か分かるかも。

grepでドル記号やバックスラッシュを検索する