grep(1)
默认情况下使用POSIX 基本正则表达式,与
选项一起使用时使用POSIX 扩展正则表达式。-E
在POSIX 正则表达式中,非特殊字符在转义时具有未定义的行为,例如。\s
,并且没有非贪婪匹配的语法,例如。+?
. 此外,在 BRE 中,+
and|
运算符不可用,必须对括号进行转义才能执行分组。
POSIX 字符类 [[:space:]]
和分别是和的[[:alnum:]_]
可移植替代品。\s
\w
从重复中排除下一个匹配字符可用于模拟非贪婪匹配,例如。[^*]+?\w*:
相当于[^*[:alnum:]_:]+[[:alnum:]_]*:
。
给定的正则表达式可以表示为多个 BRE:
grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \
-e '[^*]\{1,\}\.com\.au$' file1
或 ERE:
grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \
file1
请注意,GNU 实现grep(1)
允许将短字符类(\s
和\w
)和非贪婪重复(+?
)作为不可移植的扩展。