使用sed修改xml文件

时间:2013-08-10 22:17:41

标签: xml sed

我需要在xml文件中搜索一些位于开始/结束标记内的文本,如果找到,则在结束标记之前写一行文本。

例如,在 XML文件中,我需要在 MyTag 中搜索“MyText1”。如果找到,请在结束标记之前添加 FoundIt ,如下所示

 <MyTag>
 <Tag1>MyText1</Tag1>
 <Tag2>MyText2</Tag2>
 <Tag3>MyText3</Tag3>
 <Tag4>MyText4</Tag4>
 <FoundTag1>FoundIt</FoundTag1>
 </MyTag>

我能够使用sed搜索范围并打印MyText1。但我真正希望能够在结束标记之前添加“FoundIt”标记。

Sed脚本

/<MyTag>/,/<\/MyTag>/{
/<Tag1>MyText1</Tag1>/p
}

XML文件内容

<XmlFile>

<BeginTag>
<SomeTag>Text</SomeTag>
</BegingTag>

<MyTag>
<Tag1>MyText1</Tag1>
<Tag2>MyText2</Tag2>
<Tag3>MyText3</Tag3>
<Tag4>MyText4</Tag4>
</MyTag>

<EndTag>
<SomeTag>Text</SomeTag>
</EndTag>

</XmlFile>

2 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed '/<MyTag>/!b;:a;/<\/MyTag>/!{$!{N;ba}};/MyText1/s/.*\n/&<FoundTag1>FoundIt<\/FoundTag1>\n/' xml_file

如果没有拯救,请查找包含<MyTag>的行。找到后,收集行直到行</MyTag>出现,然后检查这些行是否包含MyText1,如果是,请在最后一行收集之前替换<FoundTag1>FoundIt</FoundTag1>后跟新行。

答案 1 :(得分:0)

你可以试试这个:

sed -n '
    /<MyTag>/,/<\/MyTag>/!{p;}; 
    /<MyTag>/,/<\/MyTag>/{H;}; 
    /<\/MyTag>/{s/.*//;x;}; 
    /.*MyText1.*/{s/<\/MyTag>/<FoundTag1>FoundIt<\/FoundTag1>\n&/;};
    /<\/MyTag>/{p;}; 
' \
xml_file