2017-02-18 57 views
0

我試圖從文本中提取IP地址,並不明白根據我寫的正則表達式的結果。 Apparantly這樣的: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,在那裏我得到了不同的迴應。爲什麼?

+0

regex101不支持sed的正則表達式。你不能將它用於sed。 – hek2mgl

+0

輸入是一個json文檔嗎? – hek2mgl

+0

@ hek2mgl是的,但我對sed的工作方式更感興趣。我知道有更好的方法來解析json。 – erihanse

回答

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 s怎麼樣了相同的行爲:https://regex101.com/r/Fy5Lj3/4

+0

即使它在這種情況下看起來相同,regex101不支持posix正則表達式並且不能用作參考 – hek2mgl

+0

@ hek2mgl不一般,正確。但在這種情況下,它只是'。*'而且行爲是相同的。 – melpomene

+0

如果你給初學者,那還是*非常*誤導。你應該已經解釋過,因爲你看到OP不知道這一點。 – hek2mgl

0

一般建議:regex101.com不支持通過sed支持正則表達式語言。這些在POSIX規範中有解釋。

雖然簡單的東西可能看起來很相似,但表達式差別很大的細節。做而不是在使用sed的正則表達式時使用regex101。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/15257373) –

+0

我不同意這種特殊情況。 – hek2mgl

+0

被問到的問題是_「爲什麼我最終得到了?」_使用regex101.com與問題相切,因此您的「答案」應該是一條評論。 –

相關問題