簡體   English   中英

有人可以分解這個正則表達式嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM