Bash正規表現の「(」16進コード

Bash正規表現の「(」16進コード

シェルで奇妙な動作が発生します。

正規表現の「_」を16進コードに一致させようとすると機能しますが、「(」では機能しません。

$ regex1=$'\x5f'
$ pattern1='_'
$ if [[ $pattern1 =~ $regex1 ]]; then echo yes; else echo no; fi
yes

$ regex2=$'\x28'
$ pattern2='('
$ if [[ $pattern2 =~ $regex2 ]]; then echo yes; else echo no; fi
no

この行動を説明できますか?

ベストアンサー1

regex2=$'\x28'まったく同じですregex2='('。シェルは$'...'値を割り当てるときに引用符を処理します。(それ自体は無効な正規表現なので、次の終了ステータスを返す[[ =~ ]]ことでエラーが報告されます2

$ re='('; [[ "(" =~ $re ]]; echo "$?"
2

(もちろんifステートメント内では、1「一致しない」終了コードと「エラー」終了コードの2違いを区別できませんが、違いはあります。)

正規表現で開く括弧をエスケープする必要があります。

$ re='\('; [[ "(" =~ $re ]] && echo match
match

またはかっこグループに入れてください。

$ re='[(]'; [[ "(" =~ $re ]] && echo match
match

クイックテスト後、Bashの正規表現は16進数または8進数の文字エスケープをサポートしていないため、機能しませre='\050're='\x28'

おすすめ記事