次の正規表現があり、これを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
BRE
orを使用してbashスクリプトを使用していますERE
。
ベストアンサー1
正規表現をシェルglobに変換したい場合は、すべての正規表現演算子をシェルglob演算子に変換できるわけではありません。たとえば、regexpと同等の標準globはありません*
。
ただし、一部のシェルはこの目的のためにグローバル演算子を拡張します。このオプションは、このオプションzsh
が有効になっている場合にのみ発生します#
。extendedglob
kshではx*
。 、このオプションを有効にすると、ksh拡張演算子のサブセットである、、、およびのみサポートされます(逆参照を除く、、、、、...)。*(x)
bash
extglob
@(...)
?(...)
*(...)
+(...)
~(...)
\d
\s
{1,3}(...)
ksh93には、printf
型ディレクティブを使用して拡張正規表現をksh globに変換するための組み込み関数があります%P
(%R
ksh 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
一致します。-
+
019
bash
また、演算子を使用して拡張正規表現パターンマッチングを実行することもbash
、もちろん[[ $string =~ $regexp ]]
、などの正規表現マッチングを実行できるツールやgrep
高度なシェルを呼び出すこともできます。結局、これはシェルの目的です。 :コマンド。perl
awk
sed
zsh
ksh93