使用sed-linux命令

使用sed-linux命令,linux,shell,sh,Linux,Shell,Sh,在我的shell脚本代码中,我看到有一条线路正在使用sed命令处理电话号码 sed "s~<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone>~~g" input.xml > output.xml sed“s~none[]*~~g”input.xml>output.xml 我不理解正则表达式的实际功能 <Telephone type[ ]*

在我的
shell脚本
代码中,我看到有一条线路正在使用
sed
命令处理
电话
号码

sed "s~<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone>~~g" input.xml > output.xml
sed“s~none[]*~~g”input.xml>output.xml
我不理解正则表达式的实际功能

<Telephone type[ ]*=[ ]*\"fax\"[ ]*><Number>none[ ]*</Number></Telephone>
none[]*
我正在做里维尔工程来让它工作

我的xml结构如下所示

<ContactMethod>
    <InternetEmailAddress>donald.francis@lexisnexis.com</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>

唐纳德。francis@lexisnexis.com
215-639-9000 x3281
484-231-1141
不适用
215-639-9000 x3281
484-231-1141
没有一个
484-231-1141ADSADASD

正则表达式识别编号为
none
条目,并将其删除

细分:

s
sed命令用于“替换”

~
图案分隔符。您可以为此选择任何字符。sed重新编码它,因为它紧跟在
s
之后

none
与文本匹配

[]*
匹配零个或多个空格

与文本匹配

~~
模式分隔符结束搜索模式,并包围一个空的替换模式

g
是一个标志,表示替换将在每行上执行多次


唯一让我困惑的是,这个模式与任何有换行符的模式都不匹配,因此我假设您的
input.xml
的格式与示例数据中的格式不同?

sed“s~text~~g”文件
将删除出现在
文件
中的任何
文本
sed
是否识别
\s
中的空白?如果是这样的话,最好是推荐超过
[]
?@特洛伊木马:没有人推荐任何东西。也就是说,我不确定
\s
的可移植性有多好,但我怀疑OP是否在乎。您可以使用sed执行
[[:space:]
,但它仍然处理行,因此您不会找到任何换行符。有一些习惯用法(“idia”?)可以在保留空间中累积行,但由于sed命令都是一个字符,我发现很快就无法读取\@格伦尼查克曼:同意(除非复数通常只有在单数为“idium”时才是“idia”…英语拼写实际上并不那么可靠)。