regex - 如何使用 sed 修复 xml 问题

标签 regex xml sed

我有一个具有以下(无效)结构的 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/

相关文章:

linux - (sed 初学者)替换环境变量中的字符

regex - Linux bash : sed, awk 等工具将行尾正则表达式 '$' 匹配为终端宽度

c# - 如何构建正则表达式以匹配由空格分隔的固定字符串?

r - 按数据类型拆分 R 中的字符串

python - 正则表达式匹配大括号内的数字

c# - 用于查找完整文本并插入空格的正则表达式

c# - 使用 linq 将数据添加到现有的 xml 文件

java - 字符串无法解析或者不是字段?

xmlstarlet-更新特定节点上的值

linux - 在 Linux 中使用 sed 从日志文件中提取行