仅匹配第一次出现的数字

时间:2016-06-01 20:34:59

标签: regex bash grep text-processing

经过几个小时的失望搜索,我无法解决这个问题。

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

示例:

nmcli --version
nmcli tool, version 1.1.93

用正则表达式管道grep

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

输出:

1
1
9
3

我想要的是什么:

1

是的,有一种方法可以用另一根烟斗做到这一点,但是那里是纯净的"单一的正则表达式呢?

5 个答案:

答案 0 :(得分:3)

使用GNU grep:

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

输出:

1

请参阅:Support of \K in regex

答案 1 :(得分:1)

虽然您想避免使用其他流程,但在现有命令中添加head似乎最简单...

grep -o [[:digit:]] | head -n1

答案 2 :(得分:0)

from mechanize import Browser
br = Browser()
br.set_handle_robots( False )
br.addheaders = [('User-agent', 'Firefox')]
br.open( "http://warframe.market" )
br.select_form(nr=0)
br.form[ 'search-item' ] = 'Primed Chamber'
br.submit()
resp = resp.get_data()
print content

答案 3 :(得分:0)

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

$ 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 0x30到0x39之外的数字。

可以相当安全地说nmcli不会使用,例如,Devangari数字,如1.2.3.4。{/ 1}。

答案 4 :(得分:-2)

您可以使用标准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