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