【发布时间】:2015-10-02 04:03:04
【问题描述】:
我有一个具有以下(无效)结构的 xml
<tag1>text1<tag2>text2</tag1><tag3>text3</tag3><tag1></tag2>text4</tag1>
我想用sed改成
<tag1>text1<tag2>text2<tag3>text3</tag3></tag2>text4</tag1>
即如果我遇到无效的 xml 子字符串为 <tag1></*
我尝试使用 sed 没有成功(下面是这样的尝试)
sed -e 's/<\/tag1>\(.*\)<tag1><\//\1<\//g'
它确实适用于上面的示例,但如果我有两次出现相同的情况,它只会删除第一个 </tag1> 和最后一个 <tag1>,而不是执行两次替换
echo '<tag1>text1<tag2>text2</tag1><tag3>text3</tag3><tag1></tag2>text4</tag1><tag1>text5<tag4>text6</tag1><tag3>text7</tag3><tag1></tag4>text8</tag1>' | sed -e 's/<\/tag1>\(.*\)<tag1><\//\1<\//g'
输出
<tag1>text1<tag2>text2<tag3>text3</tag3><tag1></tag2>text4</tag1><tag1>text5<tag4>text6</tag1><tag3>text7</tag3></tag4>text8</tag1>
我认为 sed 只是扩展了 RE 以覆盖最大的选择,但是如果我不希望它做这样的事情该怎么办?
【问题讨论】:
-
让我换个方式问我的问题,下面的算法可以在 sed 中实现吗? 1. 搜索
<tag1></2. 向后搜索第一个</tag1>3. 从中间的文本中删除</tag1>和<tag1> -
你知道,正确的解决方案是修复产生无效 XML 的过程。
-
不幸的是,这不是我能拥有的奢侈品。