我有一个具有以下(无效)结构的 xml
<tag1>text1<tag2>text2</tag1><tag3>text3</tag3><tag1></tag2>text4</tag1>
我想用sed改成
<tag1>text1<tag2>text2<tag3>text3</tag3></tag2>text4</tag1>
即我想删除 </tag1>...<tag1>
(并在封闭的 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 不支持它。可以使用 perl 还是必须使用 sed?
尝试:perl -p -e 's/<\/tag1>(.*?)<tag1>(\<\/.+?<\/tag1>)/\1\2/g'
我认为问题在于正则表达式必须匹配到实际结束的结尾,否则结束标记将成为下一场比赛的开始。
关于regex - 如何使用 sed 修复 xml 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31391015/