如何在 grep 中使用 [:digit:] 匹配多个数字?

如何在 grep 中使用 [:digit:] 匹配多个数字?

我是第一次使用 grep,在阅读手册后,我决定使用 [:digit:] 而不是 \d 或 [0-9] 来匹配数字。我发现在grep中,实际上是[[:digit:]]匹配数字。虽然我设法理解为什么有双括号,但我无法找到匹配多个整数的方法。

echo 'i100s'|grep -o '[[:digit:]]'

将打印(如预期):

1
0
0

但如果我尝试

echo 'i100s'|grep -o '[[:digit:]]+'

或者

echo 'i100s'|grep -o '[[:digit:]]{0,3}'

或者

echo 'i100s'|grep -o '[[:digit:]]\+'
echo 'i100s'|grep -o '[[:digit:]]\{0,3\}'

它将无法匹配任何内容。为什么?

答案1

+ 运算符是继最古老的 grep 版本之后的一项创新。在此之前,您必须将 + 表示为单个实例,后跟带有 * 的同一实例。不太优雅。显然范围运算符也属于同一类别。进行搜索时,你会在 Vim 上遇到同样的问题,除非你在前面加上 \v (vim 相当于 -E)。

正如 John1024 指出的,在 Mac 上,

$echo 'i100s'| grep -Eo '[[:digit:]]+'
100
$echo 'i100s'| egrep -o '[[:digit:]]+'
100

gnu grep 的文档(可通过 homebrew 或其他包管理器在 Mac 上使用)表示其默认行为是 -F (假设基本正则表达式),但就像 john1024 所说,我的经验是它支持高级表达式而不使用 - E 或egrep变体。如果您使用 homebrew 安装 gnu grep,它会很有帮助地将其安装为ggrep,因此,如果使用 Mac 和 的脚本行为之间存在一些不兼容性grepggrep您可以通过将符号链接从一个可执行文件更改为另一个可执行文件来解决它。

相关内容