Perlのメタ引用符のようなegrepのメタ文字をエスケープする方法は?

Perlのメタ引用符のようなegrepのメタ文字をエスケープする方法は?

metaquote()Perlには、正規表現からすべての特殊文字をエスケープする機能があります。

これに相当する技術がありますかegrep

例:文字列を検索する場合は、abc.def.ghi手動エスケープポイントを覚えておく必要があります。abc\.def\.ghi

egrep私はこれを行うための組み込みモード/関数がないと仮定していますが、Perl / sed / awkで "one-liners"を使用してこれをエミュレートすることmetaquote()もできます。また、Perlegrepは単純な場合には機能しますが、metaquote()正規表現間の式の構文は異なります。egrepperl

答え1

パターンを固定文字列として-F扱うには、オプションを使用します。grep

grep -F 'abc.def.ghi' <file

また、電話する必要がないことに注意してくださいegrep

答え2

自分で行う必要があります。この sed コマンドは英数字以外の文字をエスケープします。つまり、quotemeta(IIRC)

str="abc.def.ghi"
escaped=$(sed 's/[^[:alnum:]]/\\&/g' <<< "$str")

echo "$escaped"    # => abc\.def\.ghi
  1. 正規表現として生の文字列を使用するので、一致したいです。

    $ echo "foo bar abc-def-ghi baz" | grep "$str"
    foo bar abc-def-ghi baz
    
  2. エスケープされた文字列を使用するため、これが一致するとは予想されません。

    $ echo "foo bar abc-def-ghi baz" | grep "$escaped"
    $ echo $?
    1
    
  3. エスケープされた文字列を使用するので、一致させたいのです。

    $ echo "foo bar abc.def.ghi baz" | grep "$escaped"
    foo bar abc.def.ghi baz
    

関連情報