2013-07-17 170 views
0

在我的shellscript代碼中,我看到有線正在使用sed命令處理Telephone號碼。使用sed linux命令

sed "s~<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone>~~g" input.xml > output.xml 

我不理解正則表達式實際做了什麼。

<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone> 

我正在做崇敬工程得到這個工作。

我的xml結構如下。

<ContactMethod> 
    <InternetEmailAddress>[email protected]</InternetEmailAddress> 
    <Telephone type = "work"> 
     <Number>215-639-9000 x3281</Number> 
    </Telephone> 
    <Telephone type = "home"> 
     <Number>484-231-1141</Number> 
    </Telephone> 
    <Telephone type = "fax"> 
     <Number>N/A</Number> 
    </Telephone> 
    <Telephone type = "work"> 
     <Number>215-639-9000 x3281</Number> 
    </Telephone> 
    <Telephone type = "home"> 
     <Number>484-231-1141</Number> 
    </Telephone> 
    <Telephone type = "fax"> 
     <Number>none</Number> 
    </Telephone> 
    <Telephone type1 = "fax12234"> 
     <Number>484-231-1141sadsadasdasdaasd</Number> 
    </Telephone> 
</ContactMethod> 
+0

'sed「s〜text ~~ g」file'將刪除'file'中出現的任何'text'。 – fedorqui

回答

1

該正則表達式識別<Telephone type = "fax">項,其中數目給定爲none,並刪除它們。

擊穿:

s爲 「取代」 sed命令。

~模式分離器。你可以爲此選擇任何角色。 sed會識別它,因爲它正好在s之後。

<Telephone type這與文字文本「<電話類型」匹配。

[ ]*匹配零個或多個空格。

=相匹配的文字 「=」

[ ]*零個或多個空格匹配。

\"fax\"匹配文字文本。由於整個模式出現在引號內,所以引號會被轉義,但shell在sed看到它們之前刪除引號字符(\)。

[ ]*匹配零個或多個空格。

><Number>none匹配文字文本。

[ ]*匹配零個或多個空格。

</Number></Telephone>匹配文字文本。

~~模式分隔符結束搜索模式,並圍繞一個空的替換模式。

g是一個標誌,表示替換將在每行上執行多次。

讓我困惑的唯一事情是這種模式不會匹配其中有換行符的任何內容,所以我推測您的input.xml實際上沒有像您的示例數據那樣格式化?

+0

'sed'是否識別'\ s'爲*空格*?如果是這樣,建議通過'[]'更好? – trojanfoe

+0

@trojanfoe:沒有人推薦任何東西。也就是說,我不確定'\ s'是多麼便攜,但是我懷疑OP是否在意。 – ams

+0

你可以使用sed執行'[[:space:]]',但它仍然處理**行**,所以你不會找到任何換行符。有一些成語(「idia」?),你可以在一個容納空間中積累線條,但是因爲sed命令都是一個字符,所以我發現它很快就變得不可讀。 \ –