我正在试图弄清楚为什么我的正则表达式适用于所有其他脚本语言,但是当我将网页管道化为具有相同表达式的sed时却不行。
我正在运行:
wget -qO- http://website.com/page.html | sed -n '/([0-9]+)(?=%<\/td>)/g'
我正在查找“%&lt; / td&gt;”的最后一次出现之前的所有数字。
正则表达式适用于PHP,Python,Ruby和javascript,但在sed中,它根本不返回任何内容。
如何让这个正则表达式在sed中运行?
答案 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>
行的文件:
答案 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中使用。