提取字符串中嵌入的数字

Extract number embedded in string

所以我运行一个curl命令和grep一个关键字。

这是(经过处理的)结果:

...Dir');">Town / Village</a></th><th><a href="javascript:SetFilter(3,'ListPublicASDF','ASDFDir');">Phone Number</a></th></tr><tr class="rowodd"><td><a href="javascript:calldialog('ASDF','&Mode=view&helloThereId=42',600,800);"...

我想得到数字 42 - 命令行一行就很棒。

有人对此有什么建议吗?也许一些数字正则表达式?恐怕我没有足够的经验来构造一个优雅的解决方案。

您可以使用 grep 并启用 -P (Perl-Regexp) 参数。

$ grep -oP 'helloThereId=\K\d+' file
42
$ grep -oP '(?<=helloThereId=)\d+' file
42

\K 这里实际上做了正向后视的工作。 \K 将到目前为止匹配的文本保留在整个正则表达式匹配之外。

参考文献:

如果您的 grep 版本支持 -P,(OP 也是如此,因为它们在 Linux 上, GNU grep), 是要走的路。

为了未来读者的潜在利益,这里有替代方案:

如果您的 grep 不支持 -P,但是 支持 -o,这里有一个实用的解决方案,它只是提取数字从第 2 步的整体匹配中,通过使用 cut:

= 将输入拆分为字段
grep -Eo 'helloThereId=[0-9]+' in | cut -d= -f2 file

最后,如果您的 grep 既不支持 -P 也不支持 -o,请使用 sed: 这是一个符合 POSIX 的替代方案,使用 sedbasic 正则表达式(因此需要用 \{1,\} 模拟 + 和转义括号):

sed -n 's/.*helloThereId=\([0-9]\{1,\}\).*//p' file

这将适用于任何 UNIX OS 上的任何 sed,甚至是 Solaris 上 POSIX 之前的默认 sed:

$ sed -n 's/.*helloThereId=\([0-9]*\).*//p' file
42