提取字符串中嵌入的数字
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 - 命令行一行就很棒。
- 搜索字符串
helloThereId=
- 提取它旁边的数字(在上面的例子中是 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 的替代方案,使用 sed
和 basic 正则表达式(因此需要用 \{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
所以我运行一个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 - 命令行一行就很棒。
- 搜索字符串
helloThereId=
- 提取它旁边的数字(在上面的例子中是 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 的替代方案,使用 sed
和 basic 正则表达式(因此需要用 \{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