
是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.)
然後 -P 表示 Perl 正規表示式 (PCRE):
-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,但它仍然存在一些缺陷。