2017-08-17 78 views
3

我有一個基本的IP正則表達式,檢查IP是在0.0.0.0到255.255.255.255。當我進入爲什麼從{3}更改爲{4}不適用於此正則表達式?

grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" file.txt 

它一共有12個IP地址(這是正確的我的文本文件),但只突出了前3個字節,當我需要它來突出第四個八位也很相配。但改變它「{4}」顯示沒有匹配。

grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}" file.txt 

我快速的問題是爲什麼不突出整整4個字節爲使用{4}匹配?

回答

4

它與第四個字節不匹配,因爲表達式與八位位組匹配,然後.正好三次。由於在第4個八位字節後沒有.,所以它不匹配,也沒有突出顯示。

您可以使用

grep -E "((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.?){4}" 

這裏,\.?比賽1個或0 .字符(即.是可選的,所以第四個八位現在將匹配和將得到突出顯示)。

或者,更精確的圖案也會做:

grep -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}" 

它將匹配,並強調整個IP地址字符串。

您可以根據您的要求在模式中添加錨或字邊界。例如。這裏是一個字邊界模式的變化:

grep -E "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}\b" 

enter image description here

+0

不幸的是,當我實現「」 \?「」它開始接受錯誤的IP地址,如「1334.0.1.234」和它甚至不突出顯示整個IP地址,它切斷在''1334.0。'' –

+0

是的,這就是爲什麼我建議更精確的模式。如果您需要確保它匹配整個單詞,請使用單詞邊界。 –

+0

我也嘗試過第二種模式,因爲它是一個我理解的概念,並且它保持了相同的結果[https://imgur.com/a/V4qsC] –

相關問題