正規表現を bash パターンに変換

正規表現を bash パターンに変換

次の正規表現があり、これをbashパターンに変換したいと思います。

itg='^[-+]?[0-9]*$'
fxp='^[-+]?[0-9]*[.,]?[0-9]+$'
flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$'

数値を一致させようとしています。

Integral Values 1 21 144 -17

Fixed point values 3.142 0.334 .345 -7.345 -0.34345

Floating point values 3.142E-2 43.234E+3 234.345e7

BREorを使用してbashスクリプトを使用していますERE

ベストアンサー1

正規表現をシェルglobに変換したい場合は、すべての正規表現演算子をシェルglob演算子に変換できるわけではありません。たとえば、regexpと同等の標準globはありません*

ただし、一部のシェルはこの目的のためにグローバル演算子を拡張します。このオプションは、このオプションzshが有効になっている場合にのみ発生します#extendedglobkshではx*。 、このオプションを有効にすると、ksh拡張演算子のサブセットである、、、およびのみサポートされます(逆参照を除く、、、、、...)。*(x)bashextglob@(...)?(...)*(...)+(...)~(...)\d\s{1,3}(...)

ksh93には、printf型ディレクティブを使用して拡張正規表現をksh globに変換するための組み込み関数があります%P%Rksh globから(ast-openフレーバー)正規表現に逆変換を実行する)。

運が良ければ、以下から結果グロブを使うことができますbash -O extglob

$ itg='^[-+]?[0-9]*$'
$ fxp='^[-+]?[0-9]*[.,]?[0-9]+$'
$ flp='^[-+]?[0-9]*[.,]?[0-9]+([eE][-+]?[0-9]+)?$'
$ ksh -c 'printf "%P\n" "$@"' ksh "$itg" "$fxp" "$flp"
?([-+])*([0-9])
?([-+])*([0-9])?([.,])+([0-9])
?([-+])*([0-9])?([.,])+([0-9])?([eE]?([-+])+([0-9]))

ここであなたは幸運です。それはあるbash -O extglob

とにかく、入力検証に使用するには、0123456789の10文字の代わりにbash(および今日最も一般的なロケール)[0-9]で一致する文字に変更する必要があります。[0123456789][0-9]

また、正規表現は、空の文字列や算術評価などの数字(誤った8進数)とitg一致します。-+019bash

また、演算子を使用して拡張正規表現パターンマッチングを実行することもbash、もちろん[[ $string =~ $regexp ]]、などの正規表現マッチングを実行できるツールやgrep高度なシェルを呼び出すこともできます。結局、これはシェルの目的です。 :コマンド。perlawksedzshksh93

おすすめ記事