Shellscript 匹配正则表达式

use*_*470 3 shell scripting regular-expression

我正在尝试检查变量是否与 POSIX shell 中的正则表达式匹配。然而,这似乎比我想象的要困难。我试图检查变量是否是有效的大小字符串(例如 10M 或 6G 等)

if echo $var | grep -Eq '^\d+[MG]$';
then
    echo "match"
else
    echo "no match"
fi
Run Code Online (Sandbox Code Playgroud)

这就是我尝试过的,但由于某种原因,即使变量包含正确的字符串,我也从未得到匹配项?知道为什么吗?

ber*_*sch 7

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
Run Code Online (Sandbox Code Playgroud)

请注意该-P选项而不是-E.

POSIX 似乎grep 不支持 PCRE。不过,我还没有阅读 POSIX ERE 定义。