grep与分组正则表达式

时间:2014-07-16 14:37:45

标签: regex bash

我写了一个常规的exprssion:

(?<value>(?<=start=)\d+)

我在Exprsso中测试了它并且它有效 当Itried在BASH脚本中使用它时,没有结果,但是数据与使用Expresso的测试中的数据相同。可以和grep一起使用,并返回数组吗?

grep -Po "(?<value>(?<=start=)\d+)" page.txt > result.txt

这是用它的方式吗?

编辑 - 示例数据(工作)

www.example.com/check?var=test&start=11

3 个答案:

答案 0 :(得分:2)

此处不需要Named Capturing Group。使用-o选项仅显示与模式匹配的匹配部分,因此使用 Positive Lookbehind 断言和-o命令行选项的组合,您不需要捕获组。 lookbehind不消耗字符串中的字符,但只断言匹配是否可能。

echo 'foo.com/check?var=test&start=11' | grep -Po '(?<=start=)\d+'
# 11

或者,\K重置报告的匹配的起始点,并且不再包括任何以前消耗的字符。例如抛弃与此相匹配的所有内容

grep -Po 'start=\K\d+'

答案 1 :(得分:1)

如果您希望获取“start =”之后的数字,则不需要命名的捕获组。你甚至不需要捕捉括号,这正是-o所做的。 简化:

grep -Po '(?<=start=)\d+'

答案 2 :(得分:0)

使用\K进行积极观察的另一种方式:

echo 'foo.com/check?var=test&start=11' | grep -Po 'start=\K\d+'
11