grep 正则表达式匹配 space and/or TAB 和 '[:space:]' class

grep regexp to match space and/or TAB and '[:space:]' class

在 CentOS 8 上,此 grep 表达式不 return 匹配字符串:

% dmidecode -t memory | grep -E '^[ \t]+Size: [0-9]+'

但是这个 return 正确匹配行(在同一个发行版上):

% dmidecode -t memory | grep -E '^[[:space:]]+Size: [0-9]+'

这种行为的原因是什么?如您所见,两次 grep 都是在扩展正则表达式模式下调用的。

使用匹配 space 字符和制表符的 [[:blank:]]。您可以省略 -E 到:

grep '^[[:blank:]]+ Size: [0-9]+'

这里的问题是 \t 字符序列。这确实 匹配 grep 正则表达式中的制表符,它匹配字符 t (不管它是基本方言还是扩展方言 RE)。它不像其他一些工具(包括使用 PCRE 方言的 GNU grep)那样被视为特殊的转义序列。

见证人:

# printf /does/ treat \t and \n special in a format
$ printf "a\tb\n" | grep "a[ \t]b" # No match
$ printf  "atb\n" | grep "a[ \t]b" # Match
atb
$ printf "a\tb\n" | grep "a[[:space:]]b" # Match
a     b
$ printf "a\tb\n" | grep "a[[:blank:]]b" # Match
a     b
$ printf "a\tb\n" | grep "a\sb" # Match, \s is a GNU grep extension
a     b
$ printf "a\tb\n" | grep -P "a\sb" # Match, GNU grep using PCRE
a     b
$ printf "a\tb\n" | grep -P "a[ \t]b" # Match, GNU grep using PCRE.
a     b