仅匹配第一个出现的数字



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

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

例:

nmcli --version
nmcli tool, version 1.1.93

管道到grep与正则表达式

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

输出:

1
1
9
3

我想要什么:

1
是的,有

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

使用 GNU grep:

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

输出:

1

请参阅:正则表达式中对 \K 的支持

尽管您想避免另一个进程,但向现有命令添加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/'
1

传统上,Grep 最适合搜索与模式匹配的文件和行。这就是为什么 grep 解决方案需要使用 Perl 正则表达式;Perl 正则表达式具有与 -o 结合使用的特性,允许 grep "开箱即用",并以它不想要的方式使用:匹配 X,但随后输出 X 的子字符串。该解决方案很简洁,但不能移植到没有 PCRE 的 grep 实现中。

顺便说一下,使用 [0-9] 匹配 ASCII 数字。[[:digit:]] 的目的是引入特定于区域设置的行为:能够匹配 ASCII 以外的数字,而不仅仅是 ASCII 0x30到 0x39。

可以肯定地说,nmcli不会使用Devangari数字(如१.२.३.४)来发布其--version

您可以改用标准awk

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

例如:

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

相关内容

  • 没有找到相关文章

最新更新