bash正则表达式不同的格式

时间:2013-11-04 07:18:59

标签: regex linux bash

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

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

所以我混淆了正则表达式的真正形式以及它们之间的区别。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

只有一个正则表达式 - 第一个。第二个是glob模式。

有关Bash支持的POSIX扩展正则表达式的描述,请参阅regex(7): http://man7.org/linux/man-pages/man7/regex.7.html

有关glob模式的说明,请参阅Bash手册:http://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html

Bash仅在[[...]]命令中使用正则表达式:http://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html

Bash使用glob模式来处理其他所有事情。

答案 1 :(得分:1)

POSIX定义:

1)两种正则表达式:BREs and EREs。这些由实用程序/内置函数使用。

BRE受到更多限制,并且为了向后兼容而存在,并且在交互式会话中输入较少。尽可能避免使用它们,而是使用ERE,它们更灵活,类似于PERL。

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

使用通常必须在将它们传递给实用程序之前引用它们,或者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)Patterns Used for Filename Expansion,也称为 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]*