我需要在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>
答案 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