Sed 提取同一行上的所有匹配项

Sed 提取同一行上的所有匹配项

我有以下行:

randomtext<News:Image>111</News:Image>morerandomtext<News:Image>abc123</News:Image>sometext<News:Image>321abc</News:Image>

<News:Image>我无法让 sed 提取和标签之间的值</News:Image>

我尝试过sed -rn 's/<News:Image>/<\/News:Image>/p' feed2.xml但无法让它工作。

我需要 sed 输出:

111

abc123

321abc

答案1

您的sed字符串变成<News:Image></News:Image>,这不是您想要的。

如果我们假设没有任何文本包含,<那么以下内容是一个简单、直接的替换:

sed -n 's/[^<]*<News:Image>\([^<]*\)<\/News:Image>[^<]*/\1\n/gp' feed2.xml

这将查找所需标签前后的任何文本,然后用开始和结束标签之间的内容替换找到的字符串,并附加一个换行符。

在更一般的情况下,例如同一行上可能有不同的标签,最容易通过两个sed调用来完成:

sed -e 's/<News:Image>/\n&/g' -e 's/<\/News:Image>/&\n/g' feed2.xml | \
    sed -n 's/[^<]*<News:Image>\(.*\)<\/News:Image>/\1/gp'

第一遍通过在前后添加换行符来将标签隔离在不同的行上,然后第二遍提取开始和结束标签之间的内容。

相关内容