使用正則運算式,我只需要匹配給定輸入字串中的 IPv4 子網掩碼:
ip=10.0.20.100::10.0.20.1:255.255.254.0:ws01.example.com::off
為了測驗這個輸入字串包含在一個名為 file.txt 的文本檔案中,但實際用例將是決議 /proc/cmdline,我需要一個在遇到“ip=”后開始決議、計數欄位和匹配的解決方案" 直到下一個空格字符。
我在 EL 7.9 作業站 x86_64 上使用 bash 4.2.46 和 GNU grep 2.20 來測驗運算式。
根據我看到的其他問題的示例,我提出了以下 grep 命令和 PCRE 正則運算式,它提供的輸出非常接近我的需要。
[user@ws01 ~]$ grep -o -P '(?<!:)(?:\:[0-9])(.*?)(?=:)' file.txt
:255.255.254.0
我對我在這里所做的事情的理解是,我從帶有“:”字符的否定后視開始嘗試排除第一個“::”欄位,然后是一個非捕獲組以匹配轉義的“ :" 字符,后跟一個數字 [0-9],然后是帶有 .*? 的捕獲組,用于字串本身的實際匹配,最后向前看下一個“:”字符。
問題是這給出了所需的字串,但在字串的開頭包含一個額外的 : 字符。
預期輸出應如下所示:
255.255.254.0
使我難以弄清楚的是分隔符不一致。該字串包括雙冒號和單冒號欄位,因此我無法簡單地匹配分隔符之間的字串。這樣做的原因是因為一個欄位可以有一個空值。例如
:<null>:ip:gw:netmask:hostname:<null>:off
此處顯示 Null 表示用戶未傳遞的省略值,用戶不需要為預期目的提供該值。
我嘗試了一些不同的運算式,正如其他答案中所建議的那樣,它們使用否定的后視和前瞻來不開始匹配 a : 與另一個相鄰:
例如,請參閱以下問題: Regular Expression to find a string included between two characters while EXCLUDING the delimiters
如果我可以單獨從第一個冒號開始匹配,該冒號后面沒有或前面沒有另一個 : 字符,同時排除冒號字符作為分隔符,并繼續匹配直到下一個也不相鄰的冒號:并且不包括冒號字符,它應該匹配所需的字串。
我可以通過在這樣的運算式中包含“255”來匹配確切的字串:(這將適用于我們目前的所有用例)
[user@ws01 ~]$ grep -o -P '(?:)255.*?(?=:)' file.txt
255.255.254.0
這里的邏輯問題是子網掩碼本身可能并不總是以“255”開頭,但它應該是一個數字,[0-9],這就是我試圖在上面的運算式中使用它的原因。為了簡單起見,我不需要驗證它不大于 255。
uj5u.com熱心網友回復:
使用grep
$ grep -oP '(?<!:)?:\K([0-9.] )(?=:[[:alpha:]])' file.txt
在此處查看演示 或
$ grep -oP '[^:]*:\K[^:[:alpha:]]*' file.txt
輸出
255.255.254.0
uj5u.com熱心網友回復:
如果這些是分隔符,那么您的值應該在一個清晰可預測的位置。
只需將每個冒號視為分隔符并選擇第 4 個欄位。
$: awk -F: '{print $4}' <<< ip=10.0.20.100::10.0.20.1:255.255.254.0:ws01.example.com::off
255.255.254.0
我不確定你的意思
使我難以弄清楚的是分隔符不一致。該字串包括雙冒號和單冒號欄位,因此我無法簡單地匹配分隔符之間的字串。
如果您的分隔符不可預測且不可決議,那么它們將毫無用處。如果您的意思是欄位可以有或沒有引號,但您需要排除引號,我們可以這樣做。如果雙冒號是一個分隔符,而單冒號是另一個分隔符,那是很糟糕的設計,但我們可能也可以處理。
$: awk -F'::' '{ split($2,x,":"); print x[2];}' <<< ip=10.0.20.100::10.0.20.1:255.255.254.0:ws01.example.com::off
255.255.254.0
對于報價,您需要提供一個示例。
uj5u.com熱心網友回復:
使用gnu-grep您可以將模式撰寫為:
grep -oP '(?<!:):\K\d{1,3}(?:\.\d{1,3}){3}(?=:(?!:))' file.txt
輸出
255.255.254.0
解釋
(?<!:):負前瞻,斷言不:向左然后匹配:\K忘記到目前為止匹配的內容\d{1,3}(?:\.\d{1,3}){3}匹配 4 次 1-3 位數字.(?=:(?!:))正向前瞻,斷言:后面不跟:
查看正則運算式演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525918.html
標籤:正则表达式重击grep
