正規表現に固定文字列を使用しますか?

正規表現に固定文字列を使用しますか?

私はCSVファイルのリストをパラメータとして受け取り、最初のファイルにある電子メールアドレスのみを出力するbashスクリプトを作成しています。これを達成するために、最初のCSVファイルの各レコードのEメールアドレスフィールドを見つけて、その内容をシェル変数として読み込みます。次に、次の正規表現を使用して、残りのgrep -iEすべてのファイルで見つけた電子メールアドレスを見つけて、部分文字列ではないことを確認しました(例:[Eメール保護]等しくない[Eメール保護])、レコードの先頭または末尾にある可能性があります。

"^(.*,)?($EMAIL_ADDRESS|\"$EMAIL_ADDRESS\")(,.*)?\$"

このアプローチの問題の1つは、電子メールアドレスの正規表現に特別な意味を持つ点が含まれていることです。私の質問は次のとおりです

  1. エレガントな方法でこの問題をどのように回避できますか?
  2. 探している値が電子メールアドレスではなく一部のフリーテキストであり、他の特殊文字も含めることができるなど、より一般的な場合にこの問題をどのように回避できますか?

答え1

Perl正規表現(grep -P ...)では、\Q...\Eこれを使用してメタ文字を保護できます。

grep -P "(^|,)\Q$EMAIL\E(,|$)" file.csv

どこ:

  • (^|,) =フィールドの始まり
  • (,|$) =フィールドの終わり

関連情報