只匹配第一次出现的数字

Match only first occurrence of digit

经过几个小时的失望搜索后,我无法弄清楚。

我正在输入 grep,我想要得到的是任何数字的第一次出现。

示例:

nmcli --version
nmcli tool, version 1.1.93

使用正则表达式进行 grep

nmcli --version |grep -o '[[:digit:]]'

输出:

1
1
9
3

我想要的:

1

是的,有一种方法可以用另一个管道做到这一点,但是有 "pure" 单个正则表达式可以做到这一点吗?

您可以改用标准 awk

nmcli --version | awk 'match([=10=], /[[:digit:]]/) {print substr([=10=], RSTART, RLENGTH); exit}'

例如:

$ seq 11111 33333 | awk 'match([=11=], /[[:digit:]]/) {print substr([=11=], RSTART, RLENGTH); exit}'
1

使用 GNU grep:

nmcli --version | grep -Po ' \K[[:digit:]]'

输出:

1

参见:Support of \K in regex

虽然您想避免另一个进程,但似乎最简单的方法是在现有命令中添加 head...

grep -o [[:digit:]] | head -n1
echo "nmcli tool, version 1.1.93" |sed "s/[^0-9]//g" |cut -c1
1

echo "nmcli tool, version 1.1.93" |grep -o '[0-9]' |head -1
1

这可以看作是一个流编辑任务:将那一行减少到第一位。基本的基于正则表达式寄存器的引用完成任务:

$ echo "junk 1.2.3.4" | sed -e 's/.* \([0-9]\).*//'
1

传统上,Grep 最适合搜索与模式匹配的文件和行。这就是 grep 解决方案需要使用 Perl 正则表达式的原因; Perl regex 具有与 -o 相结合的功能,允许 grep 转义 "out of the box" 并以其并非真正预期的方式使用:匹配 X,但随后输出 X 的子字符串。解决方案是简洁,但不可移植到没有 PCRE 的 grep 实现。

顺便说一句,使用[0-9]来匹配ASCII数字。 [[:digit:]] 的目的是引入特定于语言环境的行为:能够匹配除 ASCII 0x30 到 0x39 以外的数字。

可以肯定地说,nmcli 不会使用梵文数字,例如 १.२.३.४.

来输出它的 --version