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,但仍然存在一些缺陷。