我有以下正则表达式并想将它们转换为 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
我正在使用 bash 脚本BRE
或ERE
.
如果您的意思是将 regexp 转换为 shell glob,请注意并非所有 regexp 运算符都可以转换为 shell glob 运算符。例如, regexp 没有标准的 glob 等效项
*
。不过,一些 shell 已经为此扩展了 glob 运算符。在
zsh
中,这#
只是在extendedglob
启用该选项的情况下。在 ksh 中,相当于x*
is*(x)
。bash
,extglob
启用该选项后,支持 ksh 扩展运算符的子集:@(...)
,?(...)
,*(...)
and+(...)
only (不是反向引用,~(...)
,\d
,\s
,{1,3}(...)
...)ksh93 的
printf
内置函数可以使用其%P
格式指令将扩展的%R
正则表达式转换为 ksh glob(从 ksh glob 反向转换为(ast-open 风味的)正则表达式)。如果幸运的话,您将能够在以下位置使用生成的 glob
bash -O extglob
:在这里,你很幸运,它都是由
bash -O extglob
.在任何情况下,如果您打算将其用于输入验证,您需要更改
[0-9]
为[0123456789]
as[0-9]
in bash(以及当今大多数常见的语言环境)匹配比 10 0123456789 个多数百个字符的字符。另请注意,您的正则
itg
表达式匹配-
、+
和空字符串,以及诸如算术评估之类的数字019
,bash
例如阻塞(作为无效的八进制数)。另请注意,
bash
也可以使用其[[ $string =~ $regexp ]]
运算符进行扩展的正则表达式模式匹配,或者当然调用任何可以进行正则表达式匹配的工具,例如grep
,perl
,或更高级的 shellawk
,sed
例如zsh
orksh93
... 毕竟,这就是 shell 的用途:运行命令。