grep 使用哪种正则表达式标准?

grep 使用哪种正则表达式标准?

grep 中使用的正则表达式标准POSIX + ASCII或者有其他东西混入?

答案1

这完全取决于您传递给 grep 的标志。

正常的无标志 grep(与传递 -G 相同)使用“基本正则表达式”:

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

如果指定 -E,它将使用“扩展”正则表达式:

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

然后你有了 Perl 正则表达式 (PCRE) 的 -P:

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

基本正则表达式与扩展正则表达式

在基本正则表达式中,元字符?+{|()失去其特殊含义;而是使用反斜杠版本\?\+\{\|\(\)

传统的 egrep 不支持{元字符,而一些 egrep 实现\{却支持元字符,因此可移植脚本应该避免{在 grep -E 模式中使用,而应该使用[{]来匹配文字{

GNU grep -E 尝试支持传统用法,假设{如果它是无效间隔规范的开头,则它并不特殊。例如,该命令 grep -E '{1' 会搜索两个字符的字符串{1,而不是报告正则表达式中的语法错误。POSIX.2 允许此行为作为扩展,但可移植脚本应避免这样做。

因此,尽管 grep 力求尽可能接近 POSIX,但仍然存在一些缺陷。

相关内容