制御文字を無視して正規表現(変数など)の一部を文字通り一致させるにはどうすればよいですか。

制御文字を無視して正規表現(変数など)の一部を文字通り一致させるにはどうすればよいですか。

正規表現特殊制御文字を含むファイル名があります。

文字通り、これらすべての文字を考慮する正規表現を準備する必要があります。

簡略化されたテストケース:

strFilenameOnDB="some ( file ) name +.ok";
strFilenameToCheck="$strFilenameOnDB"; #code simplification
strRegex=".*${strFilenameToCheck}.*";
if [[ "$strFilenameOnDB" =~ $strRegex ]];then echo OK;fi

上記のアプローチは(もちろん)失敗します。

Perl では /Q /E(https://stackoverflow.com/a/3971923/1422630)拡張$ strRegexをリテラルに変換するには、bashに似ていますか?

Obs.:すでにやっていることを投稿します。ところで、もっと良い方法があるのだろうか。

ベストアンサー1

Bashの=~一致演算子では、二重引用符で囲んで正規表現にリテラル文字列を指定できます。

したがって、理論的にはPerlの\ Qと\ Eをそれぞれ二重引用符に変更するだけです。

ただし、要件が部分的に変更可能である(たとえば、拡張する追加のシェル変数を含む)、部分的にリテラルであり、それ自体がシェル変数に含まれる正規表現を使用する場合、残念ながら唯一の方法は次のとおりです。返品使用eval

つまり、サンプルコードは次のようになります。

strFilenameOnDB="some ( file ) name +.ok";
strFilenameToCheck="$strFilenameOnDB"; #code simplification
strRegex=".*\"${strFilenameToCheck}\".*";  # <<--- note the backslash before each _inner_ double-quote: this is Bash’s syntax to embed a literal double-quote in a string _made by_ double-quotes

# then we shall use eval on the whole test operation

if eval '[[ "${strFilenameOnDB}" =~ '"${strRegex}"' ]]';then echo OK;fi

# or, using a fine Bash’s shortcut:

eval '[[ "${strFilenameOnDB}" =~ '"${strRegex}"' ]]' && echo OK

要約すると、シェル変数に含まれる部分変数正規表現にリテラル文字列を含めるには、次のようにします。

  1. Perlの\ Qと\ Eの代わりに\"and anotherを使用してください。\"
  2. 慎重に引用した内容に完全なテストコマンドを含めます。eval

正規表現を含む文字列を拡張するには、これらすべてが必要です。最初, 2 つのシェル変数が"通常の Bash 引用符ではなく、正規表現のリテラル部分の先頭と末尾として扱われ、一致する操作全体が結果パターンに対して実行されます.

(必ず含める場合二重引用符またはバックスラッシュ二重引用符で囲まれたシェル変数内の正規表現で..)

ところで、.*正規表現の始まりと終わりは実際には必要ありません。これは通常、Bashの正規表現操作に暗示されているためです。実際に^は、$いいえ正規表現の前後に余分な文字を暗示したいと思います。

おすすめ記事