[英]Can someone breakdown this regular expression?
在尋找格式化“ ifconfig”輸出並僅顯示網絡接口名稱的方法時,我發現了一個正則表達式,它對OS X很有用。
ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
如何分解這個正則表達式,以便我能理解它?
這是sed
命令
s/[[:space:]:].*//;/^$/d
中間有一個分號,因此實際上是兩個命令:
s/[[:space:]:].*//
/^$/d
第一個命令是替代。 替代什么? 它在第一個2個斜杠之間。
[[:space:]:].*
任何空白或冒號的字符類[],后接零個或多個*
.
。 這將匹配第一個空格或冒號后一行中的所有內容。
用什么代替? 在第二個斜杠之間: s/...//
:無。 匹配的字符串將從每一行中刪除。
這樣就留下了以行開頭的接口名稱,其他行也保留了,但是它們都是空的,因為它們以空格開頭。
如何刪除這些空行? 那是第二個命令:
/^$/d
查找與正則表達式匹配的空行,在行^
到行$
之間沒有任何內容。 然后使用命令d
刪除它們。
剩下的就是接口名稱。
感謝本傑明和許福克斯提供的資源。 看一看,這是我的結論:
S / [[:空間:]:]。* //;
[[:space:]:]
這將搜索空格和/或:
並開始執行命令,並且此之后的所有內容(因此' .*
')都不會被替換(因為接下來的事情是//
,介於兩者之間應該是我們想要替代的東西,在這種情況下為空。)。
;
標記第一個命令的結尾
然后我們有
/ ^ $ / d
其中^$
表示搜索所有空白,而d
刪除它們。
這是錯誤的一半。 看一下其他答案,它可以為您提供完整正確的答案! 多謝你們。
這比正則表達式更像是一個命令序列,但是我認為分解該序列可能是有益的。
閱讀有關ifconfig
的手冊頁以查找此內容
(可選)可以使用-a標志代替接口名稱。 該標志指示ifconfig顯示有關系統中所有接口的信息。 -d標志將其限制為關閉的接口,-u標志將其限制為打開的接口。 如果未提供任何參數,則暗指-a。
這是完成的一部分。 管道( |
)將ifconfig
通常將打印的內容發送到sed
的標准輸入。
您正在傳遞sed
選項-E
。 同樣, man sed
是您的朋友,並告訴您此選項表示
將正則表達式解釋為擴展(現代)正則表達式,而不是基本正則表達式(BRE)。 re_format(7)手冊頁全面介紹了這兩種格式。
不過,這並不是您所需要的全部...給sed
的第一個字符串讓它知道要執行的操作。
在同一手冊中搜索“替代”一詞以達到本段:
[2addr] s /正則表達式/替換/標志
將替換字符串替換為模式空間中正則表達式的第一個實例。 除反斜杠或換行符外,可以使用任何其他字符代替斜杠來分隔RE和替換字符。 在RE和替換中,如果RE分隔符本身以反斜杠開頭,則可以用作文字字符。
現在我們可以運行man 7 re_format
來解碼第一個命令s/[[:space:]:].*//
,這意味着“對於傳遞給標准輸入的每一行,請替換與擴展的正則表達式[[:space:]:].*
和空字符串“
[[:space:]:]
=匹配字符類[:space:]
中的任何一個:
.*
=匹配任何字符( .
),零次或多次( *
) 要了解第二條命令,請查找sed
手冊頁的[2addr]d
部分。
[2addr] d
刪除模式空間並開始下一個循環。
然后,讓我們看一下下一個命令/^$/d
,該命令說:“對於傳遞給標准輸入的每一行,如果它與擴展的regex ^$
相對應,則將其刪除”
^$
=在開始( ^
)和結束( $
)之間不包含任何字符的行 我們已經討論了如何從手冊頁開始,並遵循一些線索來“解碼”您在日常生活中看到的命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.