只匹配第一次出现的数字
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
经过几个小时的失望搜索后,我无法弄清楚。
我正在输入 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