除sed外,Regex在其他任何地方都有效

除sed外,Regex在其他任何地方都有效,regex,sed,Regex,Sed,我试图弄明白为什么我的正则表达式可以在所有其他脚本语言中工作,但当我用相同的表达式将网页导入sed时却不行 我正在运行这个: wget-qO-http://website.com/page.html |sed-n'/([0-9]+)(?=%)/g' 我正在查找上次出现“%”之前的所有数字 regex在PHP、Python、Ruby和javascript中工作,但在sed中,它完全不返回任何内容 如何使正则表达式在sed中工作?sed主要用于删除/替换文件中的字符串。由于您需要提取匹配项,grep

我试图弄明白为什么我的正则表达式可以在所有其他脚本语言中工作,但当我用相同的表达式将网页导入sed时却不行

我正在运行这个:

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

我正在查找上次出现“%”之前的所有数字

regex在PHP、Python、Ruby和javascript中工作,但在sed中,它完全不返回任何内容


如何使正则表达式在sed中工作?

sed
主要用于删除/替换文件中的字符串。由于您需要提取匹配项,
grep
应该很方便,尤其是使用允许您使用PCRE正则表达式模式(同时允许lookbehind和lookahead)的
-P
选项

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

grep -oP '[0-9]+(?=%</td>)'
grep-oP'[0-9]+(?=%)
-o
选项将仅输出匹配项,
-p
将启用PCRE regex引擎解析模式

在Ubuntu 14上的测试和一个只有
word 15%word 85%word 6%word 1865%行的文件:


sed
主要用于删除/替换文件中的字符串。由于您需要提取匹配项,
grep
应该很方便,尤其是使用允许您使用PCRE正则表达式模式(同时允许lookbehind和lookahead)的
-P
选项

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

grep -oP '[0-9]+(?=%</td>)'
grep-oP'[0-9]+(?=%)
-o
选项将仅输出匹配项,
-p
将启用PCRE regex引擎解析模式

在Ubuntu 14上的测试和一个只有
word 15%word 85%word 6%word 1865%行的文件:


所有工具都支持特定的regexp变体,有些工具有额外的注意事项,有些工具支持不同的风格,具体取决于您传递给它们的参数

sed
默认支持BRE,当使用
-E
启用时,一些sed(GNU和OSX)也支持ERE,但不支持PCRE

grep
默认支持BRE,使用
-E
启用时支持ERE,使用
-p
启用时支持PCREs。不过,值得一提的是,
-P
仅是GNU grep,正如他们的手册所说,功能性是高度实验性的,因此使用它是非常困难的

awk
仅支持ERE

我认为
perl
只支持PCREs,但您必须检查手册页

给定示例输入和预期输出,我们可以向您展示如何在不需要PCRE的情况下做您想做的事情,但作为替代-据猜测,您所需要的似乎是:

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

这将适用于所有UNIX设备上的所有SED。

所有工具都支持特定的regexp变体,有些工具有额外的注意事项,有些工具支持不同的风格,具体取决于您传递给它们的参数

sed
默认支持BRE,当使用
-E
启用时,一些sed(GNU和OSX)也支持ERE,但不支持PCRE

grep
默认支持BRE,使用
-E
启用时支持ERE,使用
-p
启用时支持PCREs。不过,值得一提的是,
-P
仅是GNU grep,正如他们的手册所说,功能性是高度实验性的,因此使用它是非常困难的

awk
仅支持ERE

我认为
perl
只支持PCREs,但您必须检查手册页

给定示例输入和预期输出,我们可以向您展示如何在不需要PCRE的情况下做您想做的事情,但作为替代-据猜测,您所需要的似乎是:

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

这将在所有UNIX设备上的所有SED中工作。

@anubhava-doh!可以是awk还是grep?或者我必须重新考虑一下你要找的表达式
grep
-
grep-oP'[0-9]+(?=%)也许吧。@WiktorStribiżew真棒。这就成功了。请随意将此作为答案发布。工作得很有魅力。@anubhava doh!可以是awk还是grep?或者我必须重新考虑一下你要找的表达式
grep
-
grep-oP'[0-9]+(?=%)也许吧。@WiktorStribiżew真棒。这就成功了。请随意将此作为答案发布。工作起来很有魅力。我之前尝试过grep,但没有意识到
-P
开关,这就是为什么lookahead当时也不起作用的原因。谢谢我之前尝试过grep,但没有注意到
-P
开关,这就是为什么lookahead当时也不起作用的原因。谢谢