除了sed之外,正则表达式在其他地方都有效

时间:2017-06-23 21:34:52

标签: regex sed

我正在试图弄清楚为什么我的正则表达式适用于所有其他脚本语言,但是当我将网页管道化为具有相同表达式的sed时却不行。

我正在运行:

wget -qO- http://website.com/page.html | sed -n '/([0-9]+)(?=%<\/td>)/g'

我正在查找“%&lt; / td&gt;”的最后一次出现之前的所有数字。

正则表达式适用于PHP,Python,Ruby和javascript,但在sed中,它根本不返回任何内容。

如何让这个正则表达式在sed中运行?

2 个答案:

答案 0 :(得分:1)

sed主要用于删除/替换文件中的字符串。由于您需要提取匹配,grep应该会派上用场,特别是-P选项允许您使用PCRE正则表达式模式(允许后备和后瞻)。 / p>

因此,在您的情况下,您可以使用

grep -oP '[0-9]+(?=%</td>)'

-o选项仅输出匹配项,-P将启用PCRE正则表达式引擎解析模式。

对Ubuntu 14的测试以及只有<td>word 15%</td><td>word 85%</td><td>word 6%</td><td>word 1865%</td>行的文件:

enter image description here

答案 1 :(得分:1)

所有工具都支持特定的正则表达式变体,有些还有其他注意事项,有些工具支持不同的风格,具体取决于传递给它们的参数。

sed默认支持BRE,而某些seds(GNU和OSX)在使用-E启用时也支持ERE,但没有支持PCRE。

grep默认支持BRE,启用-E时支持ERE,启用-P时支持PCRE。值得一提的是,-P只是GNU grep,因为他们的手册页说明功能是highly experimental所以YMMV使用它。

awk仅支持ERE。

我认为perl仅支持PCRE,但您必须查看手册页。

考虑到样本输入和预期输出,我们可以向您展示如何在不需要PCRE的情况下做您想做的事情,而是代替它 - 猜测它听起来就像您需要的一样:

sed 's:.*\([0-9]*\)%</td>.*:\1:'

可以在所有UNIX机器上的所有seds中使用。