Regex bash正则表达式的不同格式

Regex bash正则表达式的不同格式,regex,linux,bash,Regex,Linux,Bash,我在代码中使用的正则表达式如下:*[^0-9]. 但最近我看到一些函数实现如下:*[!0-9]*与第一个示例的目的相同,即非整数 因此,我混淆了什么是正则表达式的真正形式,以及它们之间的区别 有人能帮我解决这个问题吗?POSIX定义: 1) 两种类型的正则表达式:。这些由实用程序/内置程序使用 BRE更受限制,其存在是为了向后兼容,并且在交互式会话中键入的内容更少。如果可能,请避免使用ERE,因为ERE更灵活,更像PERL 某些实用程序允许您在两种类型的正则表达式之间进行选择。 例如,grep默

我在代码中使用的正则表达式如下:
*[^0-9].

但最近我看到一些函数实现如下:
*[!0-9]*
与第一个示例的目的相同,即非整数

因此,我混淆了什么是正则表达式的真正形式,以及它们之间的区别

有人能帮我解决这个问题吗?

POSIX定义:

1) 两种类型的正则表达式:。这些由实用程序/内置程序使用

BRE更受限制,其存在是为了向后兼容,并且在交互式会话中键入的内容更少。如果可能,请避免使用ERE,因为ERE更灵活,更像PERL

某些实用程序允许您在两种类型的正则表达式之间进行选择。 例如,
grep
默认匹配BRE(向后兼容性…),但您可以使其与
-E
匹配ERE

Use通常必须在将它们传递给实用程序之前引用它们,否则shell将扩展它们

*[^0-9].*
既可以是BRE,也可以是ERE。在这两种情况下,它的意思与Perl正则表达式相同,相当于glob
*[!0-9]*

BRE和ERE之间的主要区别在于ERE添加了更有用的类似Perl的特殊字符,如
(a | b)
a{m,n}
a+
a?
。示例:

echo a | grep '(a|b)'
# output:
echo a | grep -E '(a|b)'
# output: a

echo a | grep 'a{1,2}'
# output:
echo a | grep -E 'a{1,2}'
# output: a
2) ,也称为globs(由POSIX
glob
C函数使用)。在转到实用程序并展开以匹配文件名之前,这些文件通常由shell展开。如果你引用它们,它们就不再扩展了

*[!0-9]*
必须是一个glob,因为BRE和ERE使用
^
而不是

echo *[!0-9]*
# output: filenames which are not numbers

echo '*[!0-9]*'
# output: *[!0-9]*

只有一个正则表达式-第一个。第二种是全球模式

有关Bash支持的POSIX扩展正则表达式的描述,请参见正则表达式(7):

有关glob模式的描述,请参见Bash手册:

Bash仅在[…]命令中使用正则表达式:


Bash对其他所有内容都使用glob模式。

[^0-9]不适用于非整数;这是非数字字符。我的意思是为了识别数字,我以前用过这种格式。你能举个例子说明每种用法吗?也就是说,每一个都使用了哪个实用程序/内置程序。第二个不是正则表达式;这是一种模式。