我正在尝试检查变量是否与 POSIX shell 中的正则表达式匹配。然而,这似乎比我想象的要困难。我试图检查变量是否是有效的大小字符串(例如 10M 或 6G 等)
if echo $var | grep -Eq '^\d+[MG]$';
then
echo "match"
else
echo "no match"
fi
这就是我尝试过的,但由于某种原因,即使变量包含正确的字符串,我也从未得到匹配项?知道为什么吗?
答案1
GNUgrep
支持三种类型的正则表达式:基本、扩展 (ERE) 和 Perl (PCRE)。在 GNU 中grep
,ERE 不提供基本功能之上的功能,但某些字符具有特殊含义,例如加号。来源:手册页。
\d
在 ERE 中没有任何特殊含义;这只是角色d
。要表达数字,请使用[[:digit:]]
或 旧的[0-9]
(我想知道是否存在[0-9]
与 不同的字符编码[[:digit:]]
)。
不过,您的表达式可以用作 PCRE:
if echo $var | grep -Pq '^\d+[MG]$';
then
echo "match"
else
echo "no match"
fi
请注意该-P
选项而不是-E
.
看起来 POSIXgrep
不支持 PCRE。不过,我还没有阅读 POSIX ERE 定义。