IP地址的Sed表达式,匹配组得到意外结果

时间:2017-02-18 13:07:18

标签: regex sed

我正在尝试从文本中提取IP地址,并且根据我写的正则表达式不理解结果。显然这个:

echo '"IPAddress": "173.14.0.3",' | sed -n -r -e 's/"IPAddress": "(.*)"/\1/p'

返回

173.14.0.3,

为什么我最后会得到,?不"(.*)"指示正则表达式在最后两个"之间创建匹配的所有内容吗?

最初我是从

开始的
echo '"IPAddress": "173.14.0.3",' | sed -n -r -e 's/"IPAddress": "([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})"/\1/p'

,但结果相同。我使用regex101,然后我得到了不同的回复。为什么呢?

2 个答案:

答案 0 :(得分:2)

您的意见:

input:            "IPAddress": "173.14.0.3",
matched by regex: ^^^^^^^^^^^^^^^^^^^^^^^^^  (note: comma not matched)
captured:                       ^^^^^^^^^^

匹配的部分被捕获的子字符串替换并替换回原始字符串,产生:

result:       173.14.0.3,
not affected:           ^
replacement:  ^^^^^^^^^^

如果你想摆脱逗号,请将它包含在匹配中(因此它不会被替换):

s/"IPAddress": "(.*)",/\1/p

regex101显示了相同的行为:https://regex101.com/r/Fy5Lj3/4

答案 1 :(得分:0)

一般建议:regex101.com 支持sed支持的正则表达式语言。这些在POSIX规范中进行了解释。

虽然简单的事情可能看起来很相似,但表达式明显不同。处理sed的正则表达式时,使用regex101。