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
在 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