Shellscript 匹配正则表达式

Shellscript 匹配正则表达式

我正在尝试检查变量是否与 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 定义。

相关内容