提取嵌入在字符串中的数字

时间:2015-04-01 12:42:25

标签: regex linux awk sed grep

所以我为一个关键字运行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)

有没有人对此有任何提示?也许是数字的一些正则表达式?我担心我没有足够的经验来构建一个优雅的解决方案。

3 个答案:

答案 0 :(得分:4)

您可以在启用grep Perl-Regexp )参数的情况下使用-P

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

\K这里实际上做了积极的看法。 \K使文本与整个正则表达式匹配保持匹配。

<强>参考文献:

答案 1 :(得分:2)

如果您的 grep版本支持-P ,(对于OP来说是正确的,因为它们位于Linux上,它附带 GNU grep), Avinash Raj's answer是可行的方法。

为了未来读者的潜在利益,以下是替代方案:

如果您的grep不支持-P,但 支持-o,则这是一个实用的解决方案,只需从总体匹配中提取数字第二步,使用=

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

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

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

答案 2 :(得分:1)

这适用于任何UNIX操作系统上的任何sed,甚至是Solaris上的pre-POSIX默认sed:

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