2013-07-17 76 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命令都是一个字符,所以我发现它很快就变得不可读。 \ –