2

我需要在 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”标签。

脚本

/<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>
4

2 回答 2

5

这可能对您有用(GNU sed):

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

查找包含<MyTag>if not bail out 的行。一旦找到,收集行直到</MyTag>出现该行,然后检查这些行是否包含,如果是,则在收集的最后一行之前MyText1替换 一个新行。<FoundTag1>FoundIt</FoundTag1>

于 2013-08-11T03:03:28.407 回答
1

你可以试试这个:

sed -n '
    /<MyTag>/,/<\/MyTag>/!{p;}; 
    /<MyTag>/,/<\/MyTag>/{H;}; 
    /<\/MyTag>/{s/.*//;x;}; 
    /.*MyText1.*/{s/<\/MyTag>/<FoundTag1>FoundIt<\/FoundTag1>\n&/;};
    /<\/MyTag>/{p;}; 
' \
xml_file
于 2013-08-11T00:56:20.473 回答