web-dev-qa-db-ja.com

Perlからのメタクオーツのようなegrepのメタ文字をエスケープする方法は?

Perlには、正規表現のすべての特殊文字をエスケープするためのmetaquote()という関数があります。

egrepに相当する手法はありますか?

例:文字列_abc.def.ghi_を検索している場合、ドットを手動でエスケープすることを忘れないでください(例:_abc\.def\.ghi_)。

egrepにはこれを行うための組み込みのモード/機能がないと思いますが、egrepmetaquote()をシミュレートするためにPerl/sed/awkの「ワンライナー」を利用できます。また、Perlのmetaquote()は些細な場合でも機能する可能性がありますが、正規表現の構文はegrepPerlで異なります。

3
kevinarpe

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

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

また、egrepを呼び出す必要がないことにも注意してください。

4
cuonglm

自分で行う必要があります。この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
    
2
glenn jackman