经过几个小时的失望搜索,我无法弄清楚这一点。
我正在管道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